본문 바로가기

DBMS/SQL Server

[SQL Server] ROLLUP 연산자가 지원되지 않는 버전에서 총합계 구하기

 

통계를 보여줄 때 ROLLUP 연산자를 사용하면 쉽게 총합계를 보여줄 수 있다.

하지만 ROLLUP 연산자가 지원되지 않는 버전이라면 어떻게 총합계를 보여줘야할까?

 

2008 버전에서 열심히 ROLLUP 연산자를 이용하여 작업을 하였다.

하지만 작업한 것을 적용해야 할 서버가 2005 버전이라는 것을 뒤늦게 알았다.

ROLLUP 연산자는 2008 버전에서 생긴 기능으로 당연히 2005 버전에서는 사용할 수 없다.

 

먼저 2008 버전 이상에서 ROLLUP 연산자를 이용한 결과를 확인해 보자.

 

 CREATE TABLE dbo.TEST_STAT (

    REG_DATE     CHAR(10)

  , USER_CNT     INT

  , ORDER_CNT    INT

  , TOTAL_CASH   INT

 )

 GO

 

 INSERT INTO dbo.TEST_STAT

 VALUES ('2013-05-01', 100, 20, 200000)

      , ('2013-05-02', 80,  21, 210000)

      , ('2013-05-03', 150, 40, 420000)

      , ('2013-05-20', 30,  5,  30000)

 GO

 

 -- 2008 버전 이상은 ROLLUP 연산자를 이용하여 총합계 계산

 SELECT REG_DATE, SUM(USER_CNT) AS USER_CNT

      , SUM(ORDER_CNT) AS ORDER_CNT

      , SUM(TOTAL_CASH) AS TOTAL_CASH

 FROM dbo.TEST_STAT

 GROUP BY ROLLUP (REG_DATE)

 GO

 

 

 

이번에는 2005 버전에서 UNION ALL 연산을 이용하여 총합계를 구해보자.

 

 -- 2005 버전 이하는 UNION ALL 연산을 이용하여 총합계 계산

 SELECT REG_DATE, SUM(USER_CNT) AS USER_CNT

      , SUM(ORDER_CNT) AS ORDER_CNT

      , SUM(TOTAL_CASH) AS TOTAL_CASH

 FROM dbo.TEST_STAT

 GROUP BY REG_DATE

 UNION ALL

 SELECT 'TOTAL', SUM(USER_CNT) AS USER_CNT

      , SUM(ORDER_CNT) AS ORDER_CNT

      , SUM(TOTAL_CASH) AS TOTAL_CASH

 FROM

     ( SELECT REG_DATE, SUM(USER_CNT) AS USER_CNT

            , SUM(ORDER_CNT) AS ORDER_CNT

            , SUM(TOTAL_CASH) AS TOTAL_CASH

       FROM dbo.TEST_STAT

       GROUP BY REG_DATE

     ) AS A

 GO

 

 

UNION ALL 연산을 이용하여 ROLLUP 연산자를 사용한 것처럼 총합계를 구할 수 있다.

하지만 ROLLUP 연산자를 사용하면 더 쉽고 가독성 좋게 구현할 수 있다.

새로운 버전이 생길 때 마다 새로운 기능이 생긴다.

이런 기능들을 잘 익혀서 적재적소에 사용하면 더 쉽고 가독성 좋게, 그리고 성능상에도 이점을

가져올 수 있다.