%12월 이후의 데이터는 있습니다. 2건
(쿼리)
SELECT
COALESCE(A.MEMOFFICE_CD,'0') AS MEM,
COALESCE(A.CUS_CD,'0') AS CUS,
COALESCE(SUM(B.TOTAL_COST), 0) AS TOTT
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::date < '2020-12-01'-- 시작일
GROUP BY MEM,CUS
10월 이전의 데이터를 불러오며 두건을 나타내고 싶습니다. 10월 이전은 데이터가 없습니다.
(쿼리)
SELECT
COALESCE(A.MEMOFFICE_CD,'0') AS MEM,
COALESCE(A.CUS_CD,'0') AS CUS,
COALESCE(B.TOTAL_COST, 0) AS TOTT
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::date < '2020-10-01'-- 시작일
GROUP BY MEM,CUS,TOTT
없지만 12월건처럼 두건으로 0이나 NULL으로 나마 표현하고싶습니다.
마농님 알려주신 결과본(세번째사진)
1. 지난번에 비교식의 자료형을 맞춰 주라고 조언했었는데요.
- 문자를 날짜로 바꾼뒤 문자조건을 주고 있네요.
- 문자 컬럼 그대로 사용해도 될 것 같습니다.
- 변경전 : AND a.trade_date::date < '2020-12-01'
- 변경후 : AND a.trade_date < '2020-12-01'
2. 한쪽에만 자료가 있는데 없는 쪽도 보여주고 싶다면?
- 아우터 조인을 하면 됩니다.
- 다만, 동일 테이블을 두번 읽는 것 보다는 한번만 읽도록 개선 가능합니다.
- 이렇게 개선하면 조인 자체가 불필요 합니다.
3. 동일테이블을 두번 조회 개선
- 조건을 개별로 주어 쿼리를 따로 실행할게 아니라
- 공통 조건은 WHERE 절에서 적용하여 쿼리는 한번만 수행하고
- 개별 조건은 SELECT 절에서 CASE 문을 활용하세요.
4. 불필요한 코드를 제거하세요.
- Coalesce 불필요.
- ::date 불필요
5. SQL 표준
- GROUP BY mem, cus 가 가능한가요?
- Select 절의 알리아스를 Group by 에서 사용하는게 불가능 한데요.
- PostgreSQL 에서는 가능한 모양입니다?
- 그래도 표준에 맞게 작성하는게 좋을 듯 합니다.
- 변경전 : GROUP BY mem, cus
- 변경후 : GROUP BY a.memoffice_cd, a.cus_cd
SELECT a.memoffice_cd AS mem , a.cus_cd AS cus , COALESCE(SUM(b.total_cost), 0) tott_12 , COALESCE(SUM(CASE WHEN a.trade_date < '2020-10-01' THEN b.total_cost END), 0) tott_10 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 ;