DB:MSSQL 2012R2
쿼리를 만들다가 해결이 안되서 올립니다.
아래 테이블이 2개가 있습니다.
특이사항은 kind인데 이게 1~ 9주차 까지이며 출석한 해당날짜를 찍는겁니다.
talbe A
mSeq kind checkdate
----------------------------------------
10017 1 2015-01-10
10017 2 2015-01-15
10017 5 2015-02-12
13529 1 2015-01-10
13529 2 2015-01-15
13529 3 2015-01-19
13529 4 2015-02-13
13529 5 2015-02-14
13529 9 2015-02-12
15021 1 2015-01-10
25756 4 2015-02-12
29521 1 2015-01-10
41444 1 2015-01-10
29521 2 2015-01-15
41444 2 2015-01-15
41444 6 2015-02-12
58778 1 2015-01-10
58778 2 2015-01-15
58778 3 2015-01-19
58778 7 2015-02-12
70141 8 2015-02-12
80282 9 2015-02-12
87750 2 2015-01-15
table B
Seq RangeName CLASS mName
----------------------------------------------
87750 01 1학년 오은영
29521 01 1학년 김철수
13529 02 3학년 이경애
15021 03 2학년 김미순
25756 04 1학년 정영화
10017 05 3학년 양인자
41444 06 2학년 김진영
58778 07 1학년 이은선
80282 08 1학년 반명옥
70141 09 1학년 권진이
출력하고 싶은 모습 order by RangeName , mName
---------------------------------------------------------
No RangeName mName CLASS kind1 kind2 kind3 kind4 kind5 kind6 kind7 kind8 kind9
1 01 오은영 1학년 0 01-15 0 0 0 0 0 0 0
2 01 김철수 1학년 01-10 01-15 0 0 0 0 0 0 0
3 02 이경애 3학년 01-10 01-15 01-19 02-13 02-14 0 0 0 02-12
.
.
이런식으로 쿼리하고 싶은데 어떻게 하면 될까요? ㅠㅠ
Comment 4
-
건우아빠
2015.02.13 14:38
-
다자녀아빠
2015.02.13 16:51
조언해주셔서 감사합니다. ^^;
일단 어떻게 해서 만들기는 했는데 이 방법말고 다른 방법은 없는지 궁금합니다.
이해도 힘들구요ㅠㅠ
아래 쿼리에 대해 설명좀 부탁합니다.
-----------------------------------------------------
if object_id('F_TEMP') is not null
drop table F_TEMP
declare @SQL nvarchar(max),@NM varchar(3000)
set @NM=''
SELECT @NM = @NM + '[' + CAST(kind AS VARCHAR(20)) +'],'
FROM (SELECT DISTINCT kind FROM tableA WHERE kind IS NOT NULL) A
SELECT @NM = LEFT(@NM,len(@NM)-1)
SET @SQL = N'SELECT RangeName,mDutyName,mName, '+ @NM +'
INTO F_TEMP
FROM(
SELECT m.RangeName,m.CLASS ,m.mName,kind,CONVERT(varchar(20), checkdate, 8) as checkdate
from tableA j
inner join tableB m on m.Seq=j.mSeq
) tpivot(max(checkdate) for kind in ('+@NM+')
) as pvtorder by 1'
exec(@SQL)
SELECT * FROM F_TEMP
실행결과
-----------------------
RangeName class mName 1 2 3 4 5 6 7 8 9 1 1학년 오은영 NULL 14:49:46 NULL NULL NULL NULL NULL NULL NULL 2 3학년 이경애 10:00:46 14:49:46 14:49:46 14:49:46 14:49:46 NULL NULL NULL 14:49:46 3 2학년 김미순 10:00:46 NULL NULL NULL NULL NULL NULL NULL NULL 4 1학년 정영화 NULL NULL NULL 14:49:46 NULL NULL NULL NULL NULL 5 3학년 양인자 10:00:46 14:49:46 NULL NULL 14:49:46 NULL NULL NULL NULL 6 2학년 김진영 10:00:46 NULL NULL NULL NULL 14:49:46 NULL NULL NULL 7 1학년 이은선 10:00:46 14:49:46 14:49:46 NULL NULL NULL 14:49:46 NULL NULL 8 1학년 반명옥 NULL NULL NULL NULL NULL NULL NULL NULL 14:49:46 9 1학년 권진이 NULL NULL NULL NULL NULL NULL NULL 14:49:46 NULL 10 1학년 김홍근 NULL NULL NULL NULL NULL NULL NULL NULL NULL 이렇게 잘 나오더라구요. 근데 필드 1,2,3...9 이것을 숫자가 아닌 문자로 1st, 2st, 3st 이렇게 변경할수 있는 방법이 있는지요?
-
건우아빠
2015.02.13 17:47
잘 하셨는데요..
굳이 동적 쿼리로 가셔야할 이유가 있나요...
kind1 kind2 kind3 kind4 kind5 kind6 kind7 kind8 kind9 로 9주차로 고정이 된다면
동적쿼리로 가실 필요가 없을듯 합니다다만...
print @SQL ; --> 해 보시면 동적쿼리로 만들어진 쿼리가 보입니다... 이걸로 바로 실행 하시는것도
또한 임시 테이블에 굳이 넣으실 필요가 있는지 ?
exec(@SQL)declare @SQL nvarchar(max),@NM varchar(3000),@NM2 varchar(3000)
set @NM=''
set @NM2=''SELECT @NM = @NM + '[' + CAST(kind AS VARCHAR(20)) +'],'
, @NM2 = @NM2 + '[' + CAST(kind AS VARCHAR(20)) +'] ['+CAST(kind AS VARCHAR(20))+'ST] ,'
FROM (SELECT DISTINCT kind FROM #tableA WHERE kind IS NOT NULL) ASELECT @NM = LEFT(@NM,len(@NM)-1)
SELECT @NM2 = LEFT(@NM2,len(@NM2)-1);SET @SQL = N'
SELECT RangeName,CLASS,mName, '+ @NM2 +'
FROM(
SELECT m.RangeName,m.CLASS ,m.mName,kind,CONVERT(varchar(20), checkdate, 8) as checkdate
from #tableA j
inner join #tableB m on m.Seq=j.mSeq
) tpivot(max(checkdate) for kind in ('+@NM+')
) as pvtorder by 1'
print @SQL ;
exec(@SQL)SELECT * FROM F_TEMP
-
다자녀아빠
2015.02.13 20:09
굳이 동적쿼리를 써야 할 이유가 있었는지에 대해 그리고 임시테이블이 필요한지에 대해서 궁금했는데 이렇듯
조언 해 주신 쿼리를 보고 있자니 말문이 막히네요 ....^^;
아뭏튼 많은것 배우게 돼서 고맙고 감사드립니다.
SELECT RangeName,class,mName, [1] [1ST] ,[2] [2ST] ,[3] [3ST] ,[4] [4ST] ,[5] [5ST] ,[6] [6ST] ,[7] [7ST] ,[8] [8ST] ,[9] [9ST]
FROM(
SELECT m.RangeName,m.class,m.mName,kind,CONVERT(varchar(20), checkdate, 8) as checkdate
from #tableA j
inner join #tableB m on m.Seq=j.Seq
) tpivot(max(checkdate) for kind in ([1],[2],[3],[4],[5],[6],[7],[8],[9])
) as pvtorder by 1
pivot 이용하시면 됩니다..