테스트에 사용된 테이블과 데이터
소계,누계를 구하는 방법은 UNION ALL을 이용한 방법과 ROLLUP을 이용한 방법이 있는데,
ROLLUP을 이용하는 경우에는 목록을 전체표시 하지 않고, Group BY로 묶여서 표시 된다.
아래 이미지를 참고하자.
-ROLLUP-
-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 구분자를 통해 '소계' 및 '총합'을 밑으로 내려준다.
다시 한번 결과값을 보자.
'데이터베이스 > MSSQL' 카테고리의 다른 글
UPDATE 하면서 증가/감소 시키기 (0) | 2021.03.03 |
---|---|
CASE를 이용하여 1개의 컬럼을 분리하기 (0) | 2021.03.01 |
[MS-SQL]SELECT 정렬 조회(오름차순,내림차순) (0) | 2021.02.23 |
[MS-SQL]기본 (CRUD)쿼리 (CREATE,INSERT,SELECT,UPDATE,DELETE) (0) | 2021.02.22 |