mssql grouping sets 질문요~ 0 4 3,115

by mp5navy mssql grouping sets [2014.02.03 15:32:07]



화면에서 서브토탈하고 그랜드토탈 구현하기가 까다로워서 쿼리로 하려고 grouping sets을 썼는데요

구조가 비슷한 두 쿼리를 유니온으로 묶고 이걸 서브로 감싸서(쿼리1, 쿼리2) grouping sets 하는거까지는 됬습니다.

헌데 쿼리1만 그랜드토탈(마지막 총 합계)이 되어야 하는거죠. 유니온으로 묶은 쿼리2는 제외하구요.


   COLUMN1 COLUMN2 COLUMN3
-----------------------------------------------------------
1 10   20
2 20   30
3 30   40
4 40   50    <---- 여기까지가 쿼리1
5(제외)    50   60    <---쿼리 2
-----------------------------------------------------------
  합계 100 140

요런식으로, 1~4까지가 쿼리1이구요 5가 쿼리2라고 치면 5의 값들을 제외한 1~4까지의 값들을 합계로 내고싶은거죠.

화면상에서는 보여줘야하고 합계 구할때는 포함되지 말아야하는데... 이거 어찌 방법이 없을까요?

고수님들 의견 부탁드립니다 ^^;;
by 마농 [2014.02.03 15:45:10]
예시 결과를 보면 상당히 단순해 보이는데요?
grouping sets 를 사용할만큼 복잡해 보이지 않네요?
실제 사용하신 쿼리를 보여 주세요.

by mp5navy [2014.02.03 15:49:55]
  SELECT CASE GROUPING(A.PICX_CODE) WHEN 0 THEN '0' ELSE '1' END SORT_ORD1
   , CASE GROUPING(A.CNTR_TYPE) WHEN 0 THEN '0' ELSE '1' END SORT_ORD2
   , CASE GROUPING(A.PICX_CODE) WHEN 0 THEN A.PICX_CODE ELSE 'GRAND TOTAL' END PICX_CODE
   , CASE GROUPING(A.CNTR_TYPE) WHEN 0 THEN A.CNTR_TYPE
    ELSE CASE GROUPING(A.PICX_CODE) WHEN 0 THEN dbo.SF_GET_COMMNAME('PIC_CODE', A.PICX_CODE) + ' TOTAL' ELSE NULL END END AS CNTR_TYPE
    , SUM(A.TYPE_QTYX) AS TYPE_QYTX
    , SUM(A.BUYG_AMNT) AS BUYG_AMNT /* TOTAL BUYING */
    , SUM(A.SELL_AMNT) AS SELL_AMNT /* TOTAL SELLING */
    , SUM(A.PRFT_AMNT) AS PRFT_AMNT  /* PROFIT */    
  FROM (
SELECT A.PICX_CODE
  , A.CNTR_TYPE
  , COUNT(A.CNTR_TYPE) AS TYPE_QTYX
  , SUM(B.BUYG_AMNT) AS BUYG_AMNT /* TOTAL BUYING */
  , SUM(B.SELL_AMNT) AS SELL_AMNT /* TOTAL SELLING */
  , SUM(B.SELL_AMNT) - SUM(B.BUYG_AMNT) AS PRFT_AMNT  /* PROFIT */
  FROM TC_CNTRXM A
  INNER JOIN (
 SELECT A.BRCH_CODE
   , A.CNTR_SEQN
   , SUM(ISNULL(A.BUYG_AMNT,0)) + SUM(ISNULL(A.BCOM_AMNT,0)) + SUM(ISNULL(A.BSUR_AMNT,0))
+ SUM(ISNULL(A.BOTR_AMNT,0)) + SUM(ISNULL(A.HDLG_AMNT,0)) + SUM(ISNULL(A.STRG_AMNT,0))
+ SUM(ISNULL(A.REPR_AMNT,0)) + SUM(ISNULL(A.MOVE_AMNT,0)) + SUM(ISNULL(A.ETCX_AMNT,0)) AS BUYG_AMNT
   , SUM(ISNULL(A.SELL_AMNT,0)) + SUM(ISNULL(A.ADSL_AMNT,0)) + SUM(ISNULL(A.LEAS_AMNT,0)) AS SELL_AMNT
   FROM TC_CNTRHS A
  WHERE BRCH_CODE = 'KDMES'
    AND ISNULL(A.CNTR_SEQN,'') != ''
  GROUP BY A.BRCH_CODE, A.CNTR_SEQN
 ) B
ON A.BRCH_CODE = B.BRCH_CODE
  AND A.CNTR_SEQN = B.CNTR_SEQN
  INNER JOIN TC_SELLXM C
ON A.BRCH_CODE = C.BRCH_CODE
  AND A.SELL_NUMB = C.DOCX_NUMB
WHERE A.BRCH_CODE = 'KDMES'
   AND A.CNTR_STEP IN ('22','23')
   AND ISNULL(C.CRDT_YSNO,'0') != '1'
   AND A.TEAM_GUBN = '1'
   AND A.LAST_OTDT LIKE '2013' + '12%'  
GROUP BY A.PICX_CODE, A.CNTR_TYPE

UNION ALL

SELECT '999' AS PICX_CODE
  , '' AS CNTR_TYPE
  , COUNT(A.CNTR_TYPE) AS TYPE_QTYX
  , SUM(B.BUYG_AMNT) AS BUYG_AMNT /* TOTAL BUYING */
  , SUM(B.SELL_AMNT) AS SELL_AMNT /* TOTAL SELLING */
  , SUM(B.SELL_AMNT) - SUM(B.BUYG_AMNT) AS PRFT_AMNT  /* PROFIT */
  FROM TC_CNTRXM A
  INNER JOIN (
 SELECT A.BRCH_CODE
   , A.CNTR_SEQN
   , SUM(ISNULL(A.BUYG_AMNT,0)) + SUM(ISNULL(A.BCOM_AMNT,0)) + SUM(ISNULL(A.BSUR_AMNT,0))
+ SUM(ISNULL(A.BOTR_AMNT,0)) + SUM(ISNULL(A.HDLG_AMNT,0)) + SUM(ISNULL(A.STRG_AMNT,0))
+ SUM(ISNULL(A.REPR_AMNT,0)) + SUM(ISNULL(A.MOVE_AMNT,0)) + SUM(ISNULL(A.ETCX_AMNT,0)) AS BUYG_AMNT
   , SUM(ISNULL(A.SELL_AMNT,0)) + SUM(ISNULL(A.ADSL_AMNT,0)) + SUM(ISNULL(A.LEAS_AMNT,0)) AS SELL_AMNT
   FROM TC_CNTRHS A
  WHERE BRCH_CODE = 'KDMES'
    AND ISNULL(A.CNTR_SEQN,'') != ''
  GROUP BY A.BRCH_CODE, A.CNTR_SEQN
 ) B
ON A.BRCH_CODE = B.BRCH_CODE
  AND A.CNTR_SEQN = B.CNTR_SEQN
WHERE A.BRCH_CODE = 'KDMES'
   AND A.CNTR_STEP IN ('40','41','42','50','51','52','60','61','62','80','81','82')
   AND A.TEAM_GUBN = '1'
   AND A.LAST_OTDT LIKE '2013' + '12%'
) A
   GROUP BY GROUPING SETS((A.PICX_CODE, A.CNTR_TYPE), (A.PICX_CODE), ())

이런식입니다. 화면상에서 요값들가지고 서브, 그랜드 토탈을 구현할 거라서요. 그다지 복잡하진 않습니다

by 마농 [2014.02.03 17:26:38]
UNION ALL 후에 Grouping Sets 하지 마시고...
1번 SQL 만 Grouping Sets 한 후 UNION ALL 하세요.
그리고 Grouping Sets 보다는 With Rollup 이 더 적당할 듯 합니다.

by mp5navy [2014.02.03 18:04:26]

네 그러네요 정렬만 따로 해줘서 의외로 간단하게 끝났네요 감사합니다 :)

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입