YONG-MIN

ROLLUP을 이용한 부서별 상위계정과목 집계 SQL

데이터베이스/SQL 2018. 11. 10. 20:10

부서별 상위계정코드로 집계하는 SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
WITH TEST /* SAMPLE DATA */
AS
(
    SELECT '10' AS DEPT_CODE, '110' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 100 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '110' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 100 AS USE_AMT
     UNION ALL
    SELECT '20' AS DEPT_CODE, '120' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 200 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '120' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 300 AS USE_AMT
     UNION ALL
    SELECT '20' AS DEPT_CODE, '120' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 100 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '120' AS ACCT_CODE, '100' AS UP_ACCT_CODE, 200 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '210' AS ACCT_CODE, '200' AS UP_ACCT_CODE, 300 AS USE_AMT
     UNION ALL
    SELECT '30' AS DEPT_CODE, '220' AS ACCT_CODE, '200' AS UP_ACCT_CODE, 500 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '230' AS ACCT_CODE, '200' AS UP_ACCT_CODE, 100 AS USE_AMT
     UNION ALL
    SELECT '10' AS DEPT_CODE, '230' AS ACCT_CODE, '200' AS UP_ACCT_CODE, 200 AS USE_AMT
     UNION ALL
    SELECT '30' AS DEPT_CODE, '310' AS ACCT_CODE, '300' AS UP_ACCT_CODE, 300 AS USE_AMT
     UNION ALL
    SELECT '30' AS DEPT_CODE, '310' AS ACCT_CODE, '300' AS UP_ACCT_CODE, 400 AS USE_AMT
     UNION ALL
    SELECT '30' AS DEPT_CODE, '310' AS ACCT_CODE, '300' AS UP_ACCT_CODE, 500 AS USE_AMT
)
/* SQL */
SELECT A.DEPT_CODE
 
     , CASE WHEN GROUPING(A.ACCT_CODE) = 1 THEN A.UP_ACCT_CODE 
                                           ELSE A.ACCT_CODE
       END                 AS ACCT_CODE
 
     , SUM(A.USE_AMT)      AS USE_AMT
     , GROUPING(ACCT_CODE) AS IS_SUM
  FROM (
        SELECT A.DEPT_CODE, A.ACCT_CODE, A.UP_ACCT_CODE, A.USE_AMT
             , ROW_NUMBER() OVER(ORDER BY A.ACCT_CODE ASC) AS RNO
          FROM TEST A
       ) A
 GROUP BY A.DEPT_CODE, A.UP_ACCT_CODE, A.ACCT_CODE, RNO
  WITH ROLLUP
HAVING GROUPING(A.UP_ACCT_CODE) = 0 AND GROUPING(A.RNO) = GROUPING(A.ACCT_CODE)
 ORDER BY A.DEPT_CODE, A.UP_ACCT_CODE, GROUPING(A.ACCT_CODE) DESC
cs



[RESULT]


'데이터베이스 > SQL' 카테고리의 다른 글

TOP 1 대체 SQL  (0) 2018.11.11