복수 컬럼 PIVOT 어렵네요. OTL....
조언 부탁드립니다.
--준비
USE tempdb
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
--학교명, 월, 학년, 반명은 계속 데이터가 누적됩니다.(정규화는 이미 되어 있습니다.)
CREATE TABLE DBO.TB(학교명 VARCHAR(10), 월 INT, 학년 VARCHAR(10), 반명 VARCHAR(10), 참석인원 INT, 지급수 INT)
INSERT INTO TB(학교명, 월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '1학년', '1반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '1학년', '2반', 7, 12)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '1학년', '3반', 8, 14)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '2학년', '1반', 4, 9)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '2학년', '2반', 8, 11)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '2학년', '3반', 9, 14)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 1, '2학년', '4반', 6, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '1학년', '1반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '1학년', '2반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '2학년', '1반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '2학년', '2반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '2학년', '3반', 5, 10)
INSERT INTO TB(학교명,월, 학년, 반명, 참석인원, 지급수) VALUES('멋진초', 2, '3학년', '1반', 5, 10)
GO
--그룹 합 생성
SELECT 학교명, 반명, 학년, SUM(참석인원), SUM(지급수)
FROM TB
GROUP BY 학교명, 반명, 학년
GO
--반명, 학급명은 단지 예시일 뿐입니다.
학교명 | 반명 | 학년 | 참석인원 | 지급수 |
멋진초 | 1반 | 1학년 | 10 | 20 |
멋진초 | 1반 | 2학년 | 9 | 19 |
멋진초 | 1반 | 3학년 | 5 | 10 |
멋진초 | 2반 | 1학년 | 12 | 22 |
멋진초 | 2반 | 2학년 | 13 | 21 |
멋진초 | 3반 | 1학년 | 8 | 14 |
멋진초 | 3반 | 2학년 | 14 | 24 |
멋진초 | 4반 | 2학년 | 6 | 10 |
이렇게 나온 데이터를 아래와 같이 PIVOT 처리하고자 합니다.
1학년 | 1학년 | 2학년 | 2학년 | 3학년 | 3학년 | ||
학교명 | 반명 | 참석인원 | 지급수 | 참석인원 | 지급수 | 참석인원 | 지급수 |
멋진초 | 1반 | 10 | 20 | 9 | 19 | 5 | 10 |
멋진초 | 2반 | 12 | 22 | 13 | 21 | ||
멋진초 | 3반 | 8 | 14 | 14 | 24 | ||
멋진초 | 4반 | 6 | 10 |
좋은 하루 되시기 바랍니다.
고맙습니다.
집계를 내어야 할 칼럼이 많으면 동적 pivot쿼리문을 추천드리고 싶으네요.
with tmp as (
select 학교명, 학년, 반명, 참석인원, 지급수 from TB
)
select
x1.학교명,
x1.반명,
x1.[1학년] as [참석인원_1학년],
x1.[2학년] as [참석인원_2학년],
x1.[3학년] as [참석인원_3학년],
x2.[1학년] as [지급수_1학년],
x2.[2학년] as [지급수_2학년],
x2.[3학년] as [지급수_3학년]
from
(
select *
from (select 학교명, 학년, 반명, 참석인원 from tmp) as a
PIVOT(sum(참석인원) for 학년 in ([1학년], [2학년], [3학년]) ) as p1
) x1
inner join (
select *
from (select 학교명, 학년, 반명, 지급수 from tmp) as a
PIVOT(sum(지급수) for 학년 in ([1학년], [2학년], [3학년]) ) as p1
) x2
on x1.학교명 = x2.학교명
and x1.반명 = x2.반명