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
.
.
.
.
긴 글 읽어주셔서 감사드립니다
-- 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 를 이용하면 편리합니다.