[같은 키 값이 같은 것끼리 더하기 쿼리] 고수님들의 답변을 기다립니다. 0 1 2,295

by 바카니 [SQL Query] postgresql SQL 쿼리 subquery 서브쿼리 [2020.07.18 21:04:47]


안녕하세요.

궁긍적으로 하고 싶은 쿼리

KEY값(MATERIAL) 같은 것끼리 (A테이블의 총합 + B테이블의 총합 - C테이블의 총합)을 GROUP BY KEY값(MATERIAL)별로 값을 구하고싶습니다.

 

아래는 상세한 내용입니다.

 

 

 

 

 

3개의 테이블에서 추출한 값은 두 가지 입니다. 그 중 공통적인 것은 하나의 key값 입니다.

예를들어 (하단에 쿼리 작성해두었습니다.)

A 테이블의 총합, 공통 키값

B 테이블의 총합, 공통 키값

C 테이블의 총합, 공통 키값

이렇게 값을 가져옵니다.

 

제가 여쭤보고 싶은 것은

공통키가 같은 것들끼리 각각 A,B,C 테이블에서 추출한 값들끼리 더하고 빼고 싶은데요.

이를 한 방에 처리할 쿼리가 궁금합니다.

 

감사합니다!!!

 

 

 

 

MATERIAL 은 위에서 말씀드린 A,B,C 테이블의 공통이 되는 KEY값 입니다!

<A테이블>

--G_PLD_ORD_BACKLOG 구하기
SELECT 
    SUM(TFSCP.ACT_QTY::NUMERIC)       => A테이블의 총합 값
    , TFSCP.MATERIAL                         => A, B, C 테이블의 공통 KEY
FROM 
    TB_FROM_SAP_CAPACITY_PLANNING TFSCP
WHERE 1=1
AND TFSCP.PEGGED_REQMTS NOT LIKE '8%'
AND TFSCP.EARL_START BETWEEN TFSCP.EARL_START AND to_char(now() - INTERVAL '1 DAY', 'YYYYMMDD') 
GROUP BY TFSCP.MATERIAL

 

쿼리 도출값 예시

sum : 110, material : 333

sum : 110, material : 222

sum : 110, material : 111

 

 

<B테이블>

--G_CUST_ORD_BACKLOG 구하기
SELECT 
    SUM(TFSSL.ORDER_QTY::NUMERIC)   => B테이블의 총합 값
    , TFSSL.MATERIAL_NO AS MATERIAL => A, B, C 테이블의 공통 KEY
FROM 
    TB_FROM_SAP_SO_LIST TFSSL
WHERE 1=1
AND TFSSL.REASON_FOR_REJECT NOT LIKE '%91%'
AND TFSSL.GOODS_ISSUE_DATE BETWEEN GOODS_ISSUE_DATE AND to_char(now() - INTERVAL '1 DAY', 'YYYYMMDD') 
GROUP BY TFSSL.MATERIAL_NO

쿼리 도출값 예시

sum : 110, material : 333

sum : 110, material : 222

sum : 110, material : 111

 

 

 

<C테이블>
--G_PLANNED_PLANT_STOCK 구하기
SELECT 
    SUM(TFSS.TOTAL_STOCK::NUMERIC )    => C테이블의 총합 값
    , TFSS.MATERIAL                             => A, B, C 테이블의 공통 KEY
FROM TB_FROM_SAP_STOCK TFSS 
LEFT OUTER JOIN TB_FROM_SAP_CAPACITY_PLANNING TFSC ON TFSS.MATERIAL = TFSC.MATERIAL 
WHERE TFSC.PEGGED_REQMTS LIKE '8%'
GROUP BY TFSS.MATERIAL, TFSC.PEGGED_REQMTS 

쿼리 도출값 예시

sum : 110, material : 333

sum : 110, material : 222

sum : 110, material : 111

 

궁긍적으로 하고 싶은 쿼리

위의 KEY값(MATERIAL) 같은 것끼리 (A의 총합 + B의 총합 - C의 총합)을 GROUP BY KEY값(MATERIAL)별로 값을 구하고싶습니다.

 

 

 

 

 

 

by 마농 [2020.07.20 08:11:19]

이상한 부분이 있네요.
a 에서 material 로 그룹핑하여 합계를 구하고 있으므로
a 의 material 은 중복되어 여러개 있다는 의미가 됩니다.
그런데 이 a 를 c 와 조인하면서 c 의 합계를 또 구하고 있네요?
c 의 합계를 구하려면 조인 대상인 a 가 m 이 아닌 1 의 집합이어야 합니다.
c 의 material 이 중복이라면? m:n 조인이 되어버리네요.
c 의 material 이 유일하다면? 1:n 조인이 되어버리네요.
m:1 또는 1:1 형태의 조인이어야 의미가 있습니다.
1:다 또는 다대다 조인의 경우 값이 중복되어 합산되게 됩니다.

SELECT material
     , SUM(act_qty) act_qty
     , SUM(order_qty) order_qty
     , SUM(total_stock) total_stock
  FROM (SELECT material
             , act_qty::NUMERIC act_qty
             , 0 order_qty
             , 0 total_stock
          FROM tb_from_sap_capacity_planning
         WHERE pegged_reqmts NOT LIKE '8%'
           AND earl_start <= TO_CHAR(NOW() - INTERVAL '1 DAY', 'yyyymmdd')
         UNION ALL
        SELECT material
             , 0
             , order_qty::NUMERIC
             , 0 total_stock
          FROM tb_from_sap_so_list
         WHERE reason_for_reject NOT LIKE '%91%'
           AND goods_issue_date <= TO_CHAR(NOW() - INTERVAL '1 DAY', 'yyyymmdd')
         UNION ALL
        SELECT material
             , 0
             , 0
             , total_stock::NUMERIC
          FROM tb_from_sap_stock
         WHERE material IN (SELECT material
                              FROM tb_from_sap_capacity_planning
                             WHERE pegged_reqmts LIKE '8%'
                            )
        ) a
 GROUP BY material
;

 

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