group by로 데이터를 어떻게 묶어야 될지 몰라서 질문 드립니다. 0 2 1,911

by 기리 [SQL Query] group by 묶음 묶음별 합계 [2017.11.07 10:38:07]


아래는 postgre sql입니다.  딱 맞는 쿼리면 좋지만 조언이라도 부탁드립니다.

WITH WRK_POR
    AS ( SELECT A.COID
               ,A.PRDCTGCD
               ,A.PRDCD
               ,A.SALSDD
               ,A.SALEDD
               ,C.PRDNM
               ,C.PRDSPEC
               ,A.PRDSIZE
               ,B.SALPRIC
               ,A.PRDCOLOR
               ,A.POQT
               ,A.PONO
               ,A.POQT*B.SALPRIC PRICE
               , CASE WHEN A.POTY = '01' THEN '신용카드' ELSE '무통장입금' END POTTY
               ,A.SYVBANK  
               ,A.DELIVADR1
               ,A.DELIVADR2
               ,A.DELIVNO
               ,A.DELICONFRID
               ,A.POSTNO
               ,A.CMHPTELNO
               ,A.SYVHOLDNM  
               ,A.SYVBANKACNO
               ,A.CREDITCARDNO
               ,A.CREDITCARDDEALNO
               ,A.KCPCONFNO
               ,A.APPROVEYN
               ,A.CANCELYN
               ,A.PODT
          ,A.DELCHARGE
               ,TO_CHAR(A.PODT + interval '2 day', 'yyyy-mm-dd') PLUSPODT
               ,A.ST
               , '[' || SUBSTR(A.POSTNO,1,3) || '-' || SUBSTR(A.POSTNO,4,3) || '] '|| A.DELIVADR1 || A.DELIVADR2 AS DELIVADR 
          FROM   SMO_POR A , SMO_SALPRD B , SMO_PRD C 
          WHERE A.COID=B.COID AND A.PRDCTGCD=B.PRDCTGCD AND A.PRDCD=B.PRDCD
         AND A.COID=C.COID AND A.PRDCTGCD=C.PRDCTGCD AND A.PRDCD=C.PRDCD
         AND A.APPROVEYN IS NOT NULL
         AND A.APPROVEYN <> 'Y'
         AND B.SALSDD = A.SALSDD
         AND B.SALEDD = A.SALEDD
         AND CAST(B.SEQNO AS INTEGER) =  ( SELECT MAX( CAST(SEQNO AS INTEGER)) 
                                           FROM SMO_SALPRD
                                           WHERE COID = A.COID 
                                           AND PRDCTGCD= A.PRDCTGCD 
                                           AND PRDCD= A.PRDCD
                                           AND SALSDD = A.SALSDD
                                           AND SALEDD = A.SALEDD
                                          )
         AND A.DELIVNO IS NULL 
         AND A.APPROVEYN ='R'
         AND A.CANCELYN IS NULL
         AND A.USERID = #userid# 
    )
    SELECT DISTINCT *
    FROM   WRK_POR
    ORDER BY PODT DESC,PONO DESC, COID,PRDCTGCD,PRDCD,SALSDD,SALEDD         


위 쿼리는 주문내역을 보여주는 쿼리입니다 아래는 결과구요, PRICE가 50,000이 넘으면 배송비를 주도록 화면단에서 조건을 넣었습니다.
 주문번호(PONO) 제품명(PRDNM)    결제금액(A.POQT*B.SALPRIC PRICE)   배송비        묶음번호(DELCHARGE)
    1                           셔츠                          30,000                       2,500                    1
    2                           바지                          100,000                          0                     1

    3                           자켓                          30,000                        2,500                   2

    4                              코트                          60,000                         0                    3
    5                               티                            10,000                     2,500                   3

    6                              신발                           20,000                     2,500                  4
    7                              바지                           20,000                      2,500                 4
    8                               티                             5,000                       2,500                 4


원래는 주문번호 하나에 동시에 주문한 상품들이 들어가야 되지만 저는 그걸 묶음번호로 하고 있습니다.


기존의 결과에서 group by 같은걸 추가해서 아래처럼 배송비를 주고 싶은데 쿼리를 어떻게 짜야될지 감이 안잡혀서 이렇게 질문드립니다

그리고 각 묶음번호 그룹의 PRICE 합계를 뽑아 낼 수 있을까요? 1번묶음이면 30,000+100,000 = 130,000 이렇게요..

 


    주문번호(PONO) 제품명(PRDNM)    결제금액(A.POQT*B.SALPRIC PRICE)   배송비  묶음번호(DELCHARGE)
    1                           셔츠                           30,000                            2,500           1
    2                           바지                          100,000                               0             1

    3                           자켓                            30,000                           2,500           2

    4                           코트                             60,000                           2,500          3
    5                             티                              10,000                               0           3

    6                           신발                             20,000                            2,500         4
    7                           바지                             20,000                               0           4
    8                             티                               5,000                                0           4
            .
            .
            .
            .

긴 글 읽어주셔서 감사드립니다

by 마농 [2017.11.07 13:34:02]
-- 1. 우선 Distinct 를 왜 사용했는지 의문입니다.
--   - 주문 배송 관련 금액 산정하는데 Distinct 가 사용될 이유가 없습니다.
--   - 중복이 발생된다면? 테이블 설계가 잘못되었거나 SQL 작성에 문제가 있는 것입니다.
-- 2. postgre 는 분석함수 가능합니다.
     , SUM(a.poqt*b.salpric) OVER(PARTITION BY a.delcharge) 묶음배송합계
     , ROW_NUMBER() OVER(PARTITION BY a.delcharge ORDER BY a.pono) 묶음별상품순번
     , CASE WHEN SUM(a.poqt*b.salpric) OVER(PARTITION BY a.delcharge) >= 30000
             AND ROW_NUMBER() OVER(PARTITION BY a.delcharge ORDER BY a.pono) = 1
            THEN 2500 ELSE 0 END 배송비
-- 3. MAX(seq) 를 서브쿼리로 최신결과 가져오는 것도
--   - ROW_NUMBER 를 이용하면 편리합니다.

 


by 기리 [2017.11.07 14:50:02]

항상 감사합니다~ (_ _ ) 

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