안녕하세요
세로 결과를 일자에 맞게(그룹별로) 가로로 출력 하는 쿼리 문의 드립니다.
예전에 case 와 union 을 써서 출력하곤 했는데 요즘(? 오랜만에 멀 좀 하려니까) pivot 를 사용하면 된다고 하는거 같습니다.
예제등을 보긴 했는데 벅차네요
도움 부탁드립니다.
아래와 같이 등록된 데이터를
주문번호 | 배송자 | 배송일 | 주문금액 |
1 | AAA | 2013-09-02 | 100 |
2 | AAA | 2013-09-02 | 100 |
3 | BBB | 2013-09-03 | 100 |
4 | CCC | 2013-09-04 | 100 |
아래처럼 출력하고 싶습니다.
날짜 | 합계건수 | 합계금액 | AAA 건수 | AAA 합계금액 | BBB 건수 | BBB 합계금액 | CCC 건수 | CCC 합계금액 |
2013-09-01 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2013-09-02 | 2 | 200 | 2 | 200 | 0 | 0 | 0 | 0 |
2013-09-03 | 1 | 100 | 0 | 0 | 1 | 100 | 0 | 0 |
2013-09-04 | 1 | 100 | 0 | 0 | 0 | 0 | 1 | 100 |
2013-09-05 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2013-09-30 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
한달치씩 출력 하는 거라 달력 테이블과 left outer join 을 사용할 생각 이구여
물론 배송자는 늘어날수 있고, 같은 날 여러명의 배송자가 있을수 있구여....
2,3열의 합계건수 및 합계금액은 해당 row sum 하면 되니까 굳이 쿼리에서 안해도 될듯 싶습니다만....
pivot 을 써서 하려면 어떻게 해야 할까요
굳이 pivot 이 아니어도 정석인 쿼리는 어떤건가요
도움 부탁드립니다. 감사합니다.
SQL 2008 입니다.
Comment 1
-
건우아빠
2013.10.02 20:06
중첩피봇 과 동적 쿼리를 이용하시면 ...
WITH
RES AS (
SELECT 1 주문번호 ,'AAA' 배송자 ,'2013-09-02' 배송일 ,100 주문금액 , 1 수량 union all
SELECT 2 ,'AAA' ,'2013-09-02' ,200 , 2 수량 union all
SELECT 3 ,'BBB' ,'2013-09-03' ,100 , 1 수량 union all
SELECT 4 ,'CCC' ,'2013-09-04' ,500 , 5 수량 ) ,
RESULT AS ( -- 건수를 넣기 위해서 미리 뷰로 만들어도 됩니다. CASE WHEN을 이용할때는 필요 없음
SELECT A.주문번호 , A.배송자+'건수' 배송자A , A.배송자+'금액' 배송자B , A.배송자+'수량' 배송자C , A.배송일 , A.주문금액 , A.수량
FROM RES A)
SELECT 배송일
, SUM(AAA건수) [AAA건수]
, SUM(AAA수량) [AAA수량]
, SUM(AAA금액) [AAA금액]
, SUM(BBB건수) [BBB건수]
, SUM(BBB수량) [BBB수량]
, SUM(BBB금액) [BBB금액]
, SUM(CCC건수) [CCC건수]
, SUM(CCC수량) [CCC수량]
, SUM(CCC금액) [CCC금액]
FROM RESULT
PIVOT (
COUNT([주문번호])
FOR [배송자A] IN ( [AAA건수],[BBB건수], [CCC건수] )
) AS PVT1
PIVOT (
SUM([주문금액])
FOR [배송자B] IN ( [AAA금액] ,[BBB금액] ,[CCC금액] )
) AS PVT2
PIVOT (
SUM([수량])
FOR [배송자C] IN ( [AAA수량],[BBB수량],[CCC수량] )
) AS PVT3
GROUP BY 배송일