본문 바로가기
DB/SQL

[MS-SQL]UNION ALL로 소계, 합계 구하기

by 꼬바리 2021. 7. 21.

UNION ALL로 소계, 합계 구하는 법

1. 원하는 행을 SELECT한다.

2. UNION ALL

3. 소계를 구하고 싶은 컬럼을 GROUP BY 해서 SUM 한다.

4. UNION ALL

5. 합계를 구하고 ORDER BY로 SORTING한다. 

 

 

예를들어서 A~J까지의 사람이 있고

STEP에 따라서 VALUE라는 값을 부여받을때

VALUE에 대한  소계를 구하고 이에 대한 총합을 구하기 위해서는 다음과 같이 할수있다.

 

테이블

SELECT  A.*
  INTO #TEMP
  FROM 
  (
    SELECT 'A' NAME, '1' STEP, 100 VALUE
    UNION ALL
    SELECT 'B' NAME, '1' STEP, 100 VALUE
    UNION ALL
    SELECT 'C' NAME, '1' STEP, 100 VALUE
    UNION ALL
    SELECT 'D' NAME, '2' STEP, 200 VALUE
    UNION ALL
    SELECT 'E' NAME, '2' STEP, 200 VALUE
    UNION ALL
    SELECT 'F' NAME, '3' STEP, 300 VALUE
    UNION ALL
    SELECT 'G' NAME, '3' STEP, 300 VALUE
    UNION ALL
    SELECT 'H' NAME, '3' STEP, 300 VALUE
    UNION ALL
    SELECT 'I' NAME, '4' STEP, 400 VALUE
    UNION ALL
    SELECT 'J' NAME, '4' STEP, 400 VALUE
  )

 

 

 

코드

SELECT
   A.NAME,  
   A.STEP, --기준
   A.VALUE,  
  '1' SORT   
  FROM #TEMP A  
   
 UNION ALL  
   
 SELECT   
    '소계' NAME,
    A.STEP, --기준
    SUM(VALUE),  
    '2' SORT  
      
 FROM #TEMP A  
 GROUP BY STEP  
     
   UNION ALL  
   
 SELECT 
    '합계' NAME, 
    '9999' STEP, --기준
    SUM(VALUE),  
    '3' SORT  
 FROM #TEMP A  
  
ORDER BY STEP, SORT

 

결과

 

 

주의할점

1.

합계행을 만들때 주의해야할 점은 STEP별로 SORT를 하기때문에 STEP에 값이 없으면 맨 위로 올라가게된다.

그래서 STEP에 값을 제일 마지막 값으로 두어야하고, 이 마지막 값보다 큰 값이 있으면 안된다.

 

2.

SORT를 두어서 ORDER BY시 사용하는 이유는 

ORDER BY를 쓰지않은 결과물은 다음고가 같다.

 

 

 

여기서 STEP으로만 정렬을 하게되면

 

STEP으로만 정렬되기떄문에 소계행이 맨밑으로 가지 못하는 결과가 생기게된다.

 

따라서 SORT를 두어서 STEP으로 먼저 정렬하고 정렬된 파티션에서 또한번 SORT로 정렬한다면 소계행이 그 파티션의 맨 밑으로 들어갈수 있게 된다.



출처: https://nive.tistory.com/158 [기록의 발자취]

728x90
반응형

댓글