컬럼 데이터 합산 부분 질문 드립니다. 1 11 991

by 오후8시 [DB 기타] POSTGRESQL [2021.03.26 11:28:33]


질문1.PNG (21,269Bytes)
질문2.png (18,484Bytes)

전월이월 데이터를 거래처당 한번씩만 더해주고싶습니다.

첫번째사진을 보시면 거래처-DDATE마다 한번씩 더해주고있는데 

두번째사진처럼 거래처당 가장첫번째 잔액에만 전월이월데이터를 더해주고싶습니다.

IF CASE문으로 시도해보고있는데 잘 생각이 안나서 질문드립니다

고견 부탁드리겠습니다.

(현재 쿼리)

WITH COST_TAB AS (
    SELECT 1 SEQ, '청과물상회' SHOP, '2020-01-01' DDATE, 300000 TT_COST
    UNION ALL
    SELECT 2 SEQ, '청과물상회' SHOP, '2020-01-01' DDATE, 180000 TT_COST
    UNION ALL
	SELECT 3 SEQ, '청과물상회' SHOP, '2020-02-01' DDATE, 200000 TT_COST
    UNION ALL
    SELECT 4 SEQ, '청과물상회' SHOP, '2020-02-01' DDATE, 80000 TT_COST
    UNION ALL
    SELECT 5 SEQ, '미용실' SHOP, '2020-01-01' DDATE, 225000 TT_COST
	UNION ALL
	SELECT 6 SEQ, '미용실' SHOP, '2020-01-01' DDATE, 175000 TT_COST
	UNION ALL
	SELECT 7 SEQ, '미용실' SHOP, '2020-02-01' DDATE, 125000 TT_COST
	UNION ALL
	SELECT 8 SEQ, '미용실' SHOP, '2020-02-01' DDATE, 275000 TT_COST
), BAL_TAB AS (
    SELECT 1 SEQ, '청과물상회' SHOP,'[전월이월]' DDATE, 10000 BALANCE
	UNION ALL
	SELECT 2 SEQ, '미용실' SHOP,'[전월이월]' DDATE, 20000 BALANCE
)
SELECT *
FROM(
SELECT  SEQ, SHOP, DDATE, 0 AS TT_COST, BALANCE
FROM BAL_TAB

UNION ALL

SELECT CT.SEQ, CT.SHOP, CT.DDATE, CT.TT_COST, BT.BALANCE + CT.SUM_TT AS BALANE
FROM  BAL_TAB BT ,(
    SELECT SEQ, SHOP, DDATE, TT_COST ,SUM(TT_COST)OVER(PARTITION BY SHOP,DDATE ORDER BY SEQ) SUM_TT
FROM COST_TAB) CT
WHERE CT.SHOP = BT.SHOP
) DD
ORDER BY SHOP , DDATE , BALANCE

 

IF DDATE == '2020-10-01' THEN BT.BALANCE + CT.SUM_TT AS BALANE  이렇게 값을 정해놓지 않아야합니다. DDATE라는건 변하는 값이라...ㅠ

by 동동동 [2021.03.26 14:12:24]
SELECT *
FROM(
SELECT SEQ, SHOP, DDATE, 0 AS TT_COST, BALANCE
     , 0 SUM_TT
     , 0 RN1
     , 0 RN2
FROM BAL_TAB
 
UNION ALL
 
SELECT CT.SEQ, CT.SHOP, CT.DDATE, CT.TT_COST
     , CASE WHEN RN1 = 1 THEN
                 BT.BALANCE + CT.SUM_TT
            ELSE
                 CT.SUM_TT
        END BALANE
     , CT.SUM_TT   
     , RN1
     , RN2
  FROM BAL_TAB BT 
     , (
       SELECT SEQ, SHOP, DDATE, TT_COST 
            , SUM(TT_COST) OVER (PARTITION BY SHOP, DDATE ORDER BY SEQ) SUM_TT
            , RANK() OVER (PARTITION BY SHOP ORDER BY SHOP, DDATE) RN1
            , ROW_NUMBER() OVER (PARTITION BY SHOP, DDATE ORDER BY SHOP, DDATE, SEQ) RN2
         FROM COST_TAB
       ) CT
WHERE CT.SHOP = BT.SHOP
) DD
ORDER BY SHOP, RN1, DDATE, RN2 ;


그런데 전월이월 테이블이 따로 있는건가요??

 


by 오후8시 [2021.03.26 14:33:26]

아니오 전원이월 테이블 따로없습니다. 잡변감사드립니다 동동동님^^


by 동동동 [2021.03.26 14:41:59]

이월테이블이 따로 없다면 RANK() OVER 와 LAG() OVER로 하셔도 될것 같습니다.


by 오후8시 [2021.03.26 14:46:28]

위에 알려주신 쿼리도 만족합니다 랭크와 래그는 그냥 RANK() OVER() 와

로우넘버말고 이부분을 래그로 말슴이시죠?


by 동동동 [2021.03.26 14:56:09]

아...이월금액이 첫달만 적용되려면 해당 금액을 가지고 있어야 겠네요..??

전 여기가 한계...^^


by 오후8시 [2021.03.26 14:58:26]

이미해결되었으니뭐^^ 감사드려요!(꾸벅)


by pajama [2021.03.26 16:09:47]

저는 약간 끼워맞춘 느낌이긴 합니다만..^^;

 

SELECT SEQ, SHOP, DDATE, TT_COST, COALESCE(SUM(BALANCE) OVER (PARTITION BY SHOP,RN ORDER BY SEQ,DDATE),BALANCE)
FROM 
(SELECT  SEQ, SHOP, DDATE, 0 AS TT_COST, BALANCE, 1 AS RN FROM BAL_TAB
 UNION ALL
 SELECT  SEQ, SHOP, DDATE, TT_COST, TT_COST, RANK() OVER (PARTITION BY SHOP ORDER BY DDATE) FROM COST_TAB) AS t

by 동동동 [2021.03.26 16:41:40]

와우...깔끔하네요...^^


by 마농 [2021.03.29 10:46:04]

결과가 이상하네요.
전월 이월자료가 1월달에 합산된다면
2월에도 이어져서 합산되어야 하는게 아닌지?
즉, 7번 미용실의 balance 가 545000 이 나와야 하는게 아닌지?


by 오후8시 [2021.03.29 11:03:18]

전월이월 데이터는 한거래처에 한번만 더해주면됩니다^^


by 오후8시 [2021.03.29 11:04:17]

1월과 2월사이에 일계라는 소계 ROW를 끼워넣을 생각이어서 저렇게 구현했습니다 마농님^^

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