조인시 null 값 처리

도로롱·2025년 7월 20일

SQL

목록 보기
19/19
  • 상황:
    이동지시서 번호, sku 코드 ,입고일자, 제조일자, 총 수량이 같은 경우에 조인 되게끔 만들었으나,
    sku 중에서 제조일자가 없는 경우가 발생 → 이 경우에 조인 시, 입고일자 데이터가 뜨지 않게됨
select
    DISTINCT
    YEAR(CAST(MAIN."출고예정일" AS DATE)) AS "년",
    MONTH(CAST(MAIN."출고예정일" AS DATE)) AS "월",
    WEEK(CAST(MAIN."출고예정일" AS DATE)) AS "주차",
    CAST(MAIN."출고예정일" AS DATE) AS "출고예정일",
    cast(main."이동지시서_생성일자" as date) as "이동지시서_생성일자",
    MAIN."센터명",
    MAIN.inventory_transfer_order_id,
    MAIN.SKU_CODE,
    MAIN.sku_nm,
    MAIN.lv3_cate_nm,
    MAIN.lv4_cate_nm,
    CASE 
        WHEN MAIN."사유구분" ='폐기' THEN MAIN."상세사유" --- 구분자 변경 전
        ELSE MAIN."사유구분" --- 변경 후
        END AS "사유구분",
    CASE 
        WHEN MAIN."상세사유" LIKE '%선도저하%' THEN MAIN."비고"
        ELSE MAIN."상세사유"
        END AS "상세사유",
    MAIN."소비기한",
    MAIN."제조일자",
    cast(R."입고일자" as date) as "입고일자",
    CASE 
        WHEN MAIN."총수량" =0 THEN 0
        WHEN ABS(R."입고량") IS NULL THEN MAIN."총수량" 
        ELSE ABS(R."입고량") 
        END AS "폐기수량" --- 제조일자가 NULL값인 경우 입고량이 뜨질 않음
from
    MAIN 
    left join RECEVING R ON R.inventory_transfer_order_id = MAIN.inventory_transfer_order_id 
    AND R.SKU =MAIN.SKU_CODE 
    AND cast(R."소비기한" as date) = MAIN."소비기한" 
   AND (
   (MAIN."제조일자" IS NULL AND R."제조일자" IS NULL)
   OR CAST(R."제조일자" AS DATE) = MAIN."제조일자") ------- ★ 제조일자가 null 인 경우 2가지 조건으로 분기
    AND MAIN."총수량" =R."입고량"
ORDER BY
    CAST(MAIN."출고예정일" AS DATE)

  • 제조일자 null 인 경우 조인 시 2가지로 분기
    1) (MAIN."제조일자" IS NULL AND R."제조일자" IS NULL
    OR
    2) MAIN."제조일자" = R."제조일자" )

컬럼 기준으로 조인 할 경우, 해당 컬럼의 모든 값이 다 기재가 안되어 있을 수도 있으므로, NULL값임에도 붙여야 되는 케이스도 존재한다.

전 : 제조일자가 없어서, 입고일자가 NULL 값으로 붙어버림

후: 제조일자가 없더라도, 입고일자가 그 외의 조건값으로 조인 되어 붙게됨

profile
질문 없는 성장은 없다. 3년차 데이터 분석가

0개의 댓글