CREATE TABLE dbo.AA (
A_no INT,
A_name VARCHAR(50)
)
GO
INSERT INTO dbo.AA (A_no, A_name) VALUES (0, 'a')
INSERT INTO dbo.AA (A_no, A_name) VALUES (3, 'b')
INSERT INTO dbo.AA (A_no, A_name) VALUES (6, 'c')
INSERT INTO dbo.AA (A_no, A_name) VALUES (9, 'd')
CREATE TABLE dbo.BB (
B_type INT,
B_no INT
)
GO
INSERT INTO dbo.BB (B_type, B_no) VALUES (100, 0)
INSERT INTO dbo.BB (B_type, B_no) VALUES (100, 3)
INSERT INTO dbo.BB (B_type, B_no) VALUES (100, 9)
INSERT INTO dbo.BB (B_type, B_no) VALUES (200, 0)
INSERT INTO dbo.BB (B_type, B_no) VALUES (200, 3)
INSERT INTO dbo.BB (B_type, B_no) VALUES (200, 6)
INSERT INTO dbo.BB (B_type, B_no) VALUES (200, 9)
INSERT INTO dbo.BB (B_type, B_no) VALUES (300, 0)
INSERT INTO dbo.BB (B_type, B_no) VALUES (300, 3)
INSERT INTO dbo.BB (B_type, B_no) VALUES (300, 6)
INSERT INTO dbo.BB (B_type, B_no) VALUES (300, 9)
AA 테이블 결과
A_no A_name
0 a
3 b
6 c
9 d
BB 테이블 결과
B_type(장비) B_no
100 0
100 3
100 9
200 0
200 3
200 6
200 9
300 0
300 3
300 6
300 9
질문 드립니다.
* AA 테이블의 A_no 값은 BB테이블의 B_no 값과 동일합니다.
* BB테이블 B_type 컬럼의 100, 200, 300 이라는 장비엔 연속된 0,3,6,9 라는 숫자가 들어가 있어야 합니다.
그런데 B_type 컬럼의 100 장비엔 0,3,9 숫자밖에 없습니다. 그래서 6이라는 값을 3과 9 로우 사이에 넣어서 재가공을 해야 하는데요.
제가 원하는 테이블의 최종 형태는
type no bool
100 0 true
100 3 true
100 6 false <==== 이렇게 로우가 추가가 되고 bool이라는 컬럼이 추가가 되어 숫자가 있냐 없냐를 표시하면 됩니다.
100 9 true
200 0 true
200 3 true
200 6 true
200 9 true
300 0 true
300 3 true
300 6 true
300 9 true
잘 부탁 드립니다 ㅠㅠ
Comment 5
-
샤오린
2015.07.22 19:15
SELECTA.A_NO, A.A_NAME,CASE ISNULL(T.B_TYPE,'') WHEN '' THEN '100' ELSE ISNULL(T.B_TYPE,'') END B_TYPE ,CASE ISNULL(T.A_NAME,'') WHEN '' THEN 'c' ELSE ISNULL(T.A_NAME,'') END A_NAME ,CASE COUNT(T.B_NO) WHEN 1 THEN 'TRUE' ELSE 'FALSE' END BOOLFROM AA A LEFT JOIN (SELECTB.B_TYPE, A.A_NO, A.A_NAME, B.B_NOFROM AA A LEFT JOIN BB B ON A.A_NO = B.B_NOWHERE B.B_TYPE = '100')T ON A.A_NO = T.A_NOWHERE 1=1GROUP BY A.A_NO, A.A_NAME, T.B_TYPE, T.A_NAMEUNION ALLSELECTA.A_NO, A.A_NAME, T.B_TYPE, T.A_NAME,CASE COUNT(T.B_NO) WHEN 1 THEN 'TRUE' ELSE 'FALSE' END BOOLFROM AA A LEFT JOIN (SELECTB.B_TYPE, A.A_NO, A.A_NAME, B.B_NOFROM AA A INNER JOIN BB B ON A.A_NO = B.B_NOWHERE B.B_TYPE <> '100')T ON A.A_NO = T.A_NOWHERE 1=1GROUP BY A.A_NO, A.A_NAME, T.B_TYPE, T.A_NAMEORDER BY B_TYPE , A_NO -
전용진
2015.07.22 21:06
켁 이걸 지금 보다니 ㅋ 그래도 너무나 감사합니다!!
이쪽 일한지 갓 한 달 좀 넘은 신입이라 좀 무식하게 WHILE 문 돌리기 ㅋ
DECLARE @viewTbl TABLE (
machinetype INT,
sequenceid INT,
inputstatus BIT
)
DECLARE @GROUPTbl TABLE (
nid INT identity(1,1) NOT NULL,
g_type INT
)
DECLARE @cnt INT-- 그룹선언
INSERT INTO @GROUPTbl (g_type)
SELECT m_type FROM testMachine
GROUP BY m_typeSELECT * FROM @GROUPTbl
SELECT @cnt = count(*) FROM @GROUPTblDECLARE @type INT
DECLARE @i INT
SET @i = 1
WHILE @i < @cnt + 1
BEGIN
SELECT @type = g_type FROM @GROUPTbl WHERE nid = @iINSERT INTO @viewTbl (machinetype, sequenceid, inputstatus)
SELECT @type as machinetype, m_no, 1 as bool FROM testMachine WHERE m_type = @type
UNION
SELECT @type, t_no, 0 as bool
FROM testList
WHERE t_no NOT IN (
SELECT m_no FROM testMachine WHERE m_type = @type
)SET @i = @i + 1
ENDSELECT * FROM @viewTbl
디비는 진짜 어려운거 같아요 ㅠㅠㅠㅠㅠ
아무튼 관심 가져 주셔서 정말 감사드립니다
-
처리짱
2015.07.23 18:51
WHILE로 돌면서 결과값을 만들어 내는 쿼리는 별로 좋아보이지 않네요..
위 답글처럼 한번에 쿼리가 가능하면 한번에 하는게 좋아보이네요..
상황에 따라 루프를 도는게 더 좋을수도 있고요.
-
무지개
2015.07.24 16:52
이건 어떠신가요? ㅋDeclare @sql VARCHAR(4000)Declare @cnt intDeclare @MaxCount intSET @cnt = 1SET @sql = ''SET @MaxCount = (SELECT COUNT(DISTINCT B_type) FROM #BB)WHILE @cnt <= @MaxCountBEGINSET @sql = @sql +'SELECT ISNULL(a.[type],(SELECT [type]FROM(SELECT bb.B_type as [type], ROW_NUMBER() OVER(ORDER BY bb.B_type) as numFROM #BB bbGROUP BY bb.B_type) xWHERE x.num = '+CONVERT(CHAR(1),@cnt)+')) as [Type], a.ano, CASE WHEN ISNULL(a.[type],'''') = '''' THEN ''false'' ELSE ''true'' END as [no]FROM(SELECT a.A_no as ano, a.A_name as [name], b.B_Type as [type], b.B_no as bno, ROW_NUMBER() OVER(ORDER BY a.A_no) as numFROM #AA aLEFT JOIN #BB b ON a.A_no = b.B_no AND b.B_type = (SELECT [type]FROM(SELECT bb.B_type as [type], ROW_NUMBER() OVER(ORDER BY bb.B_type) as numFROM #BB bbGROUP BY bb.B_type) xWHERE x.num = '+CONVERT(CHAR(1),@cnt)+'))a'set @cnt = @cnt + 1IF (@cnt <= @MaxCount)BEGINSET @sql = @sql +'UNION ALL'ENDENDEXECute (@sql) -
Fos God
2015.08.25 17:10
sql 쿼리 공부하다가 올려봅니다. 성능은 안좋을꺼같아요 ㅠ,ㅠ
select x.A_name
, x.A_no
, x.a_type
, case when isnull(x.b_type,'') = '' then 'false' else 'true' end as no_bool
from (select a.A_no
, a.A_name
, a.b_type as a_type
, b.B_type as b_type
from (select A_no
, A_name
, b_type
from #AA , #BB ) as a
left
join ( select B_no
, b.B_type
, convert(nvarchar(10) , b.B_no) + convert(nvarchar(10) ,b.B_type) as b_key
from #BB b
) as B
on convert(nvarchar(10) , a.a_no) + convert(nvarchar(10) ,a.B_type) = b.b_key
group by a.A_no
, a.A_name
, a.b_type
, b.B_type) as x