by 오후8시 [DB 기타] POSTGRESQL [2021.03.24 11:11:25]
(현재쿼리)
select CUSTOMER_NAME, TRADE_DATE, TOTAL_COST, BALANCE from ( --기간이월부분 (SELECT DM.CUSTOMER_NAME, '-[기간전이월]'AS TRADE_DATE, 0 AS TOTAL_COST, ABS(P_PD.ZERO_COST - DM.DCOD) AS BALANCE FROM ( SELECT A.MEMOFFICE_CD, A.CUS_CD, COALESCE(SUM(CASE WHEN a.trade_date < '2020-10-01' THEN B.TOTAL_COST END), 0) ZERO_COST FROM PURSALES A INNER JOIN PURSALES_DETAIL B ON A.PURSALES_CD = B.PURSALES_CD AND A.MEMOFFICE_CD = B.MEMOFFICE_CD WHERE 1=1 AND A.MEMOFFICE_CD = 'MN202100002' AND A.PURSALES_TYPE = '2' AND A.CUS_CD IN ('CM202100003','CM202100004') AND A.TRADE_DATE < '2020-12-01'-- 시작일 GROUP BY A.MEMOFFICE_CD,A.CUS_CD )P_PD INNER JOIN ( SELECT MEMOFFICE_CD, CUSTOMER_NAME, CUS_CD, COALESCE(SUM(COST),0) DCOD FROM DEPOSIT_MANAGE WHERE 1=1 AND DM_TYPE = '1' AND MEMOFFICE_CD = 'MN202100002' AND CUS_CD IN ('CM202100003') AND DM_DATE::date < '2020-10-01'-- 시작일 GROUP BY MEMOFFICE_CD,CUSTOMER_NAME,CUS_CD )DM ON P_PD.MEMOFFICE_CD = DM.MEMOFFICE_CD AND P_PD.CUS_CD = DM.CUS_CD GROUP BY DM.CUSTOMER_NAME, P_PD.ZERO_COST, DM.DCOD ) UNION ALL -- 상품부분 (SELECT C.CUSTOMER_NAME, P_PD.TRADE_DATE , P_PD.TOTAL_COST, SUM(P_PD.TOTAL_COST) OVER(PARTITION BY C.CUSTOMER_NAME,P_PD.TRADE_DATE ORDER BY C.CUSTOMER_NAME,P_PD.TRADE_DATE,P_PD.BIGO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS BALANCE FROM CUSTOMER as C INNER JOIN( SELECT P.CUSTOMER_NAME, P.CUS_CD, P.PURSALES_CD, P.PURSALES_TYPE, P.MEMOFFICE_CD, P.TRADE_DATE, PD.PRODUCT_NAME, PD.STANDARD, PD.COUNT, PD.PRODUCT_COST, PD.SUPPLY_COST, PD.TAX_COST, (PD.SUPPLY_COST + pd.TAX_COST - PD.TOTAL_COST) AS DISCOUNT_COST, PD.TOTAL_COST, P.BIGO FROM PURSALES P INNER JOIN PURSALES_DETAIL PD on P.MEMOFFICE_CD = PD.MEMOFFICE_CD AND P.PURSALES_CD = PD.PURSALES_CD WHERE 1=1 AND P.PURSALES_TYPE='2' AND P.MEMOFFICE_CD= 'MN202100002' AND P.CUS_CD IN('CM202100003','CM202100004') AND P.TRADE_DATE >= '2020-10-01' -- 시작일 AND P.TRADE_DATE <= '2020-11-11' -- 종료일 ORDER BY P.CUSTOMER_NAME,P.TRADE_DATE ) P_PD ON C.MEMOFFICE_CD = P_PD.MEMOFFICE_CD AND C.CUS_CD = P_PD.CUS_CD AND C.CUSTOMER_NAME = P_PD.CUSTOMER_NAME WHERE 1=1 AND C.USE_YN = 'Y' AND C.CUSTOMER_TYPE IN ('2','3') AND C.CUS_CD IN ('CM202100003') AND C.MEMOFFICE_CD = 'MN202100002' ORDER BY C.CUSTOMER_NAME,P_PD.TRADE_DATE,P_PD.BIGO,BALANCE) ) RESULT_DATA
(위 쿼리의 결과 첫번째사진)
제가 고심중인 부분은 두번째 사진처럼 조회하고싶어서입니다.
조회를 했을때 두번째사진마지막조회결과 처럼 한번에 조회되게 하고싶습니다.
lag,lead함수와 재귀쿼리 쪽을 시도해보고있지만 ...막혀서 질문드립니다.
SELECT memoffice_cd , cus_cd , customer_name , trade_date , SUM(total_cost) total_cost -- + 금액 , SUM(deposit_cost) deposit_cost -- - 금액 , SUM(total_cost - deposit_cost) cost -- 차액 , SUM(SUM(total_cost - deposit_cost)) OVER( PARTITION BY memoffice_cd, cus_cd ORDER BY trade_date) balance -- 누계 FROM (SELECT a.memoffice_cd , a.cus_cd , a.customer_name , b.total_cost , 0 deposit_cost , CASE WHEN a.trade_date < '2020-10-01' THEN '-[기간전이월]' ELSE a.trade_date END trade_date FROM pursales a INNER JOIN pursales_detail b ON a.pursales_cd = b.pursales_cd AND a.memoffice_cd = b.memoffice_cd WHERE 1=1 AND a.pursales_type = '2' AND a.memoffice_cd = 'MN202100002' AND a.cus_cd IN ('CM202100003', 'CM202100004') AND a.trade_date < '2020-11-11' UNION ALL SELECT memoffice_cd , cus_cd , customer_name , 0 total_cost , cost deposit_cost , CASE WHEN dm_date < '2020-10-01' THEN '-[기간전이월]' ELSE dm_date END dm_date FROM deposit_manage WHERE 1=1 AND dm_type = '1' AND memoffice_cd = 'MN202100002' AND a.cus_cd IN ('CM202100003', 'CM202100004') AND dm_date < '2020-11-11' ) a GROUP BY memoffice_cd, cus_cd, customer_name, trade_date ;
마농님이 주신 쿼리가 조금 단어 몇개가 안맞아서 제가 살짝수정해서 이렇게 해보았습니다.
SELECT memoffice_cd , cus_cd , customer_name , trade_date , SUM(total_cost) AS TOT_COST -- + 금액 , SUM(deposit_cost) AS DEP_COST -- - 금액 , SUM(total_cost - deposit_cost) MINUS_COST -- 차액 , SUM(SUM(total_cost - deposit_cost)) OVER( PARTITION BY memoffice_cd, cus_cd ORDER BY trade_date) AS BALANCE -- 누계 FROM (SELECT P.memoffice_cd , P.cus_cd , P.customer_name , PD.total_cost , 0 AS deposit_cost , CASE WHEN P.trade_date < '2020-10-01' THEN '-[기간전이월]' ELSE P.trade_date END trade_date FROM pursales P INNER JOIN pursales_detail PD ON P.pursales_cd = PD.pursales_cd AND P.memoffice_cd = PD.memoffice_cd WHERE 1=1 AND P.pursales_type = '2' AND P.memoffice_cd = 'MN202100002' AND P.cus_cd IN ('CM202100003') AND P.trade_date <= '2020-11-11' UNION ALL SELECT memoffice_cd , cus_cd , customer_name , 0 total_cost , cost deposit_cost , CASE WHEN dm_date < '2020-10-01' THEN '-[기간전이월]' ELSE dm_date END dm_date FROM deposit_manage WHERE 1=1 AND dm_type = '1' AND memoffice_cd = 'MN202100002' AND cus_cd IN ('CM202100003') AND dm_date <= '2020-11-11' ) RESULT_DATE GROUP BY memoffice_cd, cus_cd, customer_name, trade_date
MEMOFFICE_CD | CUS_CD | CUSTOMER_NAME | TRADE_DATE | TOT_COST | DEP_COST | MINUS_COST | BALANCE |
MN202100002 | CM202100003 | 이안인테리어 | -[기간전이월] | 0 | 100000 | -100000 | -100000 |
MN202100002 | CM202100003 | 이안인테리어 | 2020-11-11 | 4050000 | 0 | 4050000 | 3950000 |
이렇게 조회가 되네용 ㅠ
제가 올린사진같이는 포스트그레에서는 안되는건가요?>
WITH COST_TAB AS ( SELECT 'TEST' NM, 1 SEQ, 0 TT_COST FROM DUAL UNION ALL SELECT 'TEST' NM, 2 SEQ, 1800000 TT_COST FROM DUAL UNION ALL SELECT 'TEST' NM, 3 SEQ, 2250000 TT_COST FROM DUAL ), BAL_TAB AS ( SELECT 'TEST' NM, 1 SEQ, 100000 BALANCE FROM DUAL ) SELECT CT.NM, CT.SEQ, CT.TT_COST, BT.BALANCE + CT.SUM_TT BALANCE FROM BAL_TAB BT ,( SELECT NM, SEQ, TT_COST, SUM(TT_COST)OVER(ORDER BY SEQ) SUM_TT FROM COST_TAB) CT WHERE CT.NM = BT.NM