누적합 (Stacked Sum) SQL 구하는 세 가지 쑈

SQL/DB 일반 2009/01/05 20:54


이럴 땐 오라클이 좋긴 좋더라. 기능도 많고...
MSSQL용 쿼리는 ORACLE로 변환 가능함.
MSSQL 쿼리에 SUM() 은 ORDER BY 절을 붙일 수 없다.

---------------------------------------------------------------------------------------------------
-- MSSQL 누적합 1번 -- JOIN ( NESTED LOOP )
WITH TA ( IDX, VAL ) AS  
(             SELECT 1 IDX,     11*1 VAL
    UNION ALL SELECT 2 IDX,    222*2 VAL
    UNION ALL SELECT 3 IDX,   3333*3 VAL
    UNION ALL SELECT 4 IDX,  44444*4 VAL
)
SELECT 
    TA1.IDX
  , TA1.VAL
  , SUM ( TA2.VAL )               "STACKED_SUM_1"
FROM TA TA1, TA TA2
WHERE TA2.IDX <= TA1.IDX
GROUP BY TA1.IDX, TA1.VAL
ORDER BY TA1.IDX ASC

OUTPUT/PLAN 더보기



---------------------------------------------------------------------------------------------------
-- MSSQL 누적합 2번 -- SCALAR SUBQUERY
WITH TA ( IDX, VAL ) AS  
(             SELECT 1 IDX,     11*1 VAL
    UNION ALL SELECT 2 IDX,    222*2 VAL
    UNION ALL SELECT 3 IDX,   3333*3 VAL
    UNION ALL SELECT 4 IDX,  44444*4 VAL
)
SELECT 
    TA1.IDX
  , TA1.VAL
  , ( SELECT SUM ( TA3.VAL )     -- 아래 플랜에 이 색으로 칠해진 부분같이 해석됨.
      FROM TA TA3               
      WHERE TA3.IDX <= TA1.IDX )  "STACKED_SUM_2"
FROM TA TA1
GROUP BY TA1.IDX, TA1.VAL
ORDER BY TA1.IDX ASC

OUTPUT/PLAN 더보기



---------------------------------------------------------------------------------------------------
-- ORACLE 누적합 ( 집계함수의 윈도우 옵션 )
WITH TA AS 
(             SELECT 1 IDX,     11*1 VAL FROM DUAL 
    UNION ALL SELECT 2 IDX,    222*2 VAL FROM DUAL 
    UNION ALL SELECT 3 IDX,   3333*3 VAL FROM DUAL 
    UNION ALL SELECT 4 IDX,  44444*4 VAL FROM DUAL 
)
SELECT 
    IDX
  , VAL
  , SUM ( VAL )
    OVER ( ORDER BY IDX ASC 
           RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) "STACKED_SUM_3"
FROM TA
ORDER BY IDX ASC

OUTPUT/PLAN 더보기

저작자 표시 비영리 변경 금지
Trackback 0 : Comment 0

Write a comment



◀ PREV : [1] : ... [49] : [50] : [51] : [52] : [53] : [54] : [55] : [56] : [57] : ... [214] : NEXT ▶
노무현 전 대통령 서거 추모글 남기기