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)별로 값을 구하고싶습니다.
이상한 부분이 있네요.
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 ;