by 어떠닝히 [2023.07.18 10:35:00]
현재 데이터를 아래와 같이 뽑아오고 있습니다.
| settlement_uid | associate_company_name | client_name | supply_price_free | supply_price_free |
| FDM-17E34800-CA57-4EEB-AA2B-75E68C6E81A8 | 제휴사1 | 고객사 | 20000 | <null> |
| FDM-3E8BA1C3-0394-4527-A53A-137DBA256A17 | 제휴사1 | 고객사 | 20000 | <null> |
| FDM-6CBBDB7D-BF7B-49B2-A5C7-FEED750BED4D | 제휴사2 | 고객사 | 590000 | <null> |
| FDM-9125B7EF-C015-4F53-B1A7-2F80413A2128 | 제휴사3 | 고객사 | 30000 | <null> |
| FDM-ADB31DDA-9543-46B3-8D62-A30488C5E973 | 제휴사1 | 고객사 | 20000 | <null> |
| FDM-C10AA308-3E17-4D99-8780-871C7AF51221 | 제휴사2 | 고객사 | 590000 | <null> |
아래는 쿼리데이터입니다.
select
client_name
, associate_company_name
, sum(supply_price_free) as supply_price_free
, sum(supply_price_tax) as supply_price_tax
from (
SELECT tfsm.settlement_uid
, tfac.associate_company_name
, tfcm.client_name
, SUM(CASE
WHEN tfsm.type_of_taxation = 'Free'
THEN (tfim.supply_price * tfsm.order_count) END) AS supply_price_free
, SUM(CASE
WHEN tfsm.type_of_taxation = 'Tax'
THEN (tfim.supply_price * tfsm.order_count) END) AS supply_price_tax
, tfsm.type_of_taxation
from t_fdm_settlement_m tfsm
left outer join t_fdm_order_m tfom
on tfsm.order_m_uid = tfom.order_m_uid
left outer join t_fdm_client_p tfcp
on tfom.client_p_uid = tfcp.client_p_uid
left outer join t_fdm_item_m tfim
on tfcp.item_m_uid = tfim.item_m_uid
left outer join t_fdm_associate_company tfac
on tfcp.associate_company_uid = tfac.associate_company_uid
left outer join t_fdm_client_m tfcm
on tfcp.client_m_uid = tfcm.client_m_uid
GROUP BY tfsm.settlement_uid
, tfac.associate_company_name
, tfcm.client_name
, tfsm.type_of_taxation
ORDER BY tfsm.settlement_uid
) a
group by
associate_company_name,
client_name,
supply_price_free,
supply_price_tax
위 쿼리 결과로 합계를 구한 데이터입니다.
| client_name | associate_company_name | supply_price_free | supply_price_free |
| 고객사 | 제휴사1 | 60000 | <null> |
| 고객사 | 제휴사2 | 30000 | <null> |
| 고객사 | 제휴사3 | 1180000 | <null> |
| 하고자하는 데이터 | |||
| client_name | 제휴사1 | 제휴사2 | 제휴사3 |
| 고객사 | 60000 | 30000 | 1180000 |
이렇게 데이터가 가는ㅇ할까요?
pivot돌리면 될거같은데 복잡하게 짜본적이 없어서
도움을 요청드립니다.
감사해요.
supply_price_free 가 두번 나오는데? 하나는 supply_price_tax 인거겠죠?
항목이 두개(free, tax)인데? 원하는 결과는 하나(free)만 필요한 건가요?
하나만 필요한게 맞는지? 둘다 필요한데 잘못 표현한 것인지? 아니면 두 값의 합계가 필요한 것인지?
단서조항이 붙었네요? 널이라서 빼도 된다? 그럼 널이 아니면 빼면 안된다는 건가요?
질문이 명확해야 합니다. 그냥 "하나만 필요하다"라고 명확하게 이야기 해주셔야 합니다.
아니면 둘다 필요하긴 한데 널이라서 안나온 것이다.?
만약 둘 다 필요한 것이면? 두줄로 나와야 하는 것인지?
넵 맞습니다. supply_price_tax가 맞아요
저렇게 표현이 가능한가요..?pivot을 많이 안해봐가주고..
도움좀 부탁드려요.
결과표가 맞는지 의문이 들어서 질문했습니다.
제가 원하는 답은 "저렇게 표현이 가능한가요." 가 아닙니다.
결과표가 맞는지? 틀린지?
왜 그런 결과표가 나왔는지에 대한 설명이 필요합니다.
항목은 두개인데 하나만 표현한 이유?
아 그렇군요
| client_name | associate_company_name | supply_price_free |
| 고객사 | 제휴사1 | 60000 |
| 고객사 | 제휴사2 | 30000 |
| 고객사 | 제휴사3 | 1180000 |
위 데이터가 맞는거라고 보시면 됩니다.
결과값이 supply_price_tax는 null이라 빼도 되구요!
그래서 결과가
| client_name | 제휴사1 | 제휴사2 | 제휴사3 |
| 고객사 | 60000 | 30000 | 1180000 |
위 데이터 처럼 됩니다!
supply_price_free하나만 필요합니다
가변값인 자료를 대상으로 피벗 하는 것은 정적쿼리로는 불가능 하고 동적쿼리를 이용해야 합니다.
다음은 3개 고정 값으로 알고 있을 때의 정적 쿼리 예시입니다.
동적 쿼리 구현은 제휴사 부분만 별도 쿼리로 가져온 뒤 동적으로 쿼리를 완성하시면 됩니다.
SELECT client_name
, SUM(CASE nm WHEN '제휴사1' THEN v END) "제휴사1"
, SUM(CASE nm WHEN '제휴사2' THEN v END) "제휴사2"
, SUM(CASE nm WHEN '제휴사3' THEN v END) "제휴사3"
FROM (SELECT tfcm.client_name
, tfac.associate_company_name nm
, tfim.supply_price * tfsm.order_count v
FROM t_fdm_settlement_m tfsm
LEFT OUTER JOIN t_fdm_order_m tfom ON tfsm.order_m_uid = tfom.order_m_uid
LEFT OUTER JOIN t_fdm_client_p tfcp ON tfom.client_p_uid = tfcp.client_p_uid
LEFT OUTER JOIN t_fdm_item_m tfim ON tfcp.item_m_uid = tfim.item_m_uid
LEFT OUTER JOIN t_fdm_associate_company tfac ON tfcp.associate_company_uid = tfac.associate_company_uid
LEFT OUTER JOIN t_fdm_client_m tfcm ON tfcp.client_m_uid = tfcm.client_m_uid
WHERE tfsm.type_of_taxation = 'Free'
) a
GROUP BY client_name
;