데이터베이스/MSSQL

품목 조회 후 누계/합계,총합 구하기(UNION)

ㅋㅋ! 2021. 2. 27. 17:17
테스트에 사용된 테이블과 데이터

 


소계,누계를 구하는 방법은 UNION ALL을 이용한 방법과 ROLLUP을 이용한 방법이 있는데,

ROLLUP을 이용하는 경우에는 목록을 전체표시 하지 않고, Group BY로 묶여서 표시 된다.

아래 이미지를 참고하자.

 

위 데이터를 ROLLUP 과 UNION ALL 해보자.

 

-ROLLUP-

ROLLUP은 공통된 품목끼리 값을 합친 후, 전체 합계를 낸다.

 

-UNION ALL-

UNION ALL은 있는 품목을 그대로 표시해주고, 품목별 소계와 전체합계를 구할 수 있다. 


UNION ALL은 SELECT로 조회된 데이터를 합쳐주는 역할을 한다.

 

주의 해야 할 점은 SELECT로 조회되는 컬럼의 개수가 동일해야한다.

 

쿼리
SELECT name,product,qty,price ,1 as seq FROM UNIONTest -- seq는 품목/소계/총합의 구별자
UNION ALL
SELECT name,'소계' AS product, sum(qty),sum(price),'2' AS seq FROM UNIONTest Group By name
UNION ALL 
SELECT '','총합' AS Product, sum(qty),sum(price),'3' AS seq FROM UNIONTest  
ORDER BY name DESC,seq ASC

한번에 보려니 머리가 아프기 때문에,

결과값만 확인해보고 UNION ALL 을 기준으로 구분지어 SELECT 값을 분석 해보자.

 

결과

이름으로 그룹지어 소계 및 총합을 구함.


SELECT 데이터를 분석 해보자

1번 SELECT

SELECT name,product,qty,price ,1 as seq FROM UNIONTest --1번째 select

크게 복잡할 것 없이, UNIONTest 테이블에서 name,product,qty,price를 불러오고, 품목/소계/합계/를 구분지을 seq=1을 반환 받는다.

결과


 

2번 SELECT

SELECT name,'소계' AS product, sum(qty),sum(price),'2' AS seq FROM UNIONTest Group By name--2번째 select

'name'컬럼을 기준으로, qty와 price의 합을 구하고, '소계'는 구분값 seq=2로 반환 받는다.

결과


3번 SELECT

SELECT '','총합' AS Product, sum(qty),sum(price),'3' AS seq FROM UNIONTest --3번째 select  

2번 SELECT와는 다르게 GROUP BY를 통해 총합을 구할 기준을 정하지 않았기 때문에,

전체 합이 구해진다. 총합의 구분자는 seq = 3

결과

 


ORDER BY name DESC,seq ASC --정렬

위와 같이 구해진 세 값을 ORDER BY 문을 통해 먼저 name을 기준으로 정렬 후, seq 구분자를 통해 '소계' 및 '총합'을 밑으로 내려준다.

다시 한번 결과값을 보자.