null 데이터 나오게 할수있는방법없 나요? 0 11 741

by 박규림 POSTGRESQL [2021.03.23 16:17:15]


1.PNG (42,225Bytes)
2.PNG (61,545Bytes)
캡처.PNG (43,346Bytes)

%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으로 나마 표현하고싶습니다.

 

마농님 알려주신 결과본(세번째사진)

 

 

by 마농 [2021.03.23 16:48:16]

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
;

 


by 박규림 [2021.03.23 17:07:21]

댓글감사드립니다^^

말씀해주셧던 불필요코드는 모두수정했습니다.

그리고 포스트그레에서는 셀렉트절의 알리아스가 그룹바이절에 쓸수있습니다. 하지만 마농님이 첨언해주신대로

컬럼이름을 그대로 쓰겠습니다. 좀더 테스트해보고 다시질문드리겠습니다. 감사합니다.!


by 박규림 [2021.03.23 17:10:11]

천재이십니다.


by 마농 [2021.03.23 17:09:36]

제가 질문을 잘못 이해한건가요?
12월 조회 10월 조회 두번해서 두개 조인하는 걸로 이해하고 답변 드렸는데.
질문을 다시 보니 그게 아닐 수도 있을 것 같네요.
그냥 하나의 쿼리인데 날짜조건이 다른 경우인건가요?
그렇다면 아우터 조인을 이용해야 하는데
아우터 조인을 하기 위한 기준 집합이 있어야 합니다.
memoffice_cd, cus_cd 를 키로 가지는 별도 테이블을 이용해 아우터 조인을 해야 합니다.


by 박규림 [2021.03.23 17:12:16]

맞게 이해하셨습니다. 10월조회해서 두건의 널이나  0데이터 조회를 원했습니다. 조인을 한이유는 두테이블을 조인을해야 토탈 코스트를 얻을수있기때문에 조인을한것입니다.


by 마농 [2021.03.23 17:16:03]

엥?
앞에 이해한게 맞다는 건지? 뒤늦게 이해한게 맞다는 건지? 헷갈리게 적으셨네요.
쿼리를 일부분만 올리시니 질문을 이해하기가 어렵습니다.


by 박규림 [2021.03.23 17:21:51]

앞에 이해한게 맞으십니다. 12월이전 데이터는 2건이있는데 10월이전에 데이터는 없습니다. 하지만 10월이전 조건검색을해서 12월데이터처럼 2건으로 널이나 0인 데이터를 표시하고싶어서 질문드렸습니다. 첨언해주셨던 알리아스 tott_10의 컬럼을 구하고싶었습니다.


by 마농 [2021.03.23 17:26:54]

결국. 12월과 10월 두개 합계가 동시에 필요하다는 거네요.
계속 헷갈리게 표현하시네요. 댓글을 보면 볼 수록 헷갈리네요.


by 박규림 [2021.03.23 17:32:08]

저는 10월의 합계만 필요했었습니다. 10월의 합계가 데이터가 없었던지라 콜리스를 써도 널이 치환이 안되더라구요.헷갈리게 이해되셨다면 죄송합니다. 다음부터는 헷갈리지 않게 질문드려보겠습니다 마농님.


by 마농 [2021.03.23 17:41:54]

그럼 결론은 다시..
10월 합계만 필요하다는 거네요.
제가 처음 이해했던 부분이 아니라 다시금 수정하여 이해한 부분이 맞는 거네요.
위 첫번째 답변은 (10월 과 12월) 두개 합계가 필요할 경우에 해당하는 답변입니다.
(10월 또는 12월) 1개 합계만 필요한 경우의 답변은 두번째로 다시 달았었는데.
아우터 조인을 하기 위한 기준집합이 필요합니다.


by 박규림 [2021.03.23 17:46:51]

원하는바를 이루었습니다. 기분상하시게 한듯하여 마음이 편하지못하네요ㅠ 다음부턴 올바르게 질문드리겠습니다.

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