안녕하세요! 아래와 같은 SQL을 작성하고 사진과 같은 결과가 나왔는데 혹시 여기서
특정 조건, 예를 들어 사진속의 SEQ_NO 가 0136인 항목(1번째줄)에는 ROW_NUMBER()를 부여하지 않고 공백처리 같은게 가능한가요?
SELECT ROW_NUMBER() OVER(PARTITION BY A.REP_SHOP ORDER BY A.REP_SHOP) NUM,
DECODE(A.REP_SHOP, '0', 0, '1', 1, '2', 2, '3', 3, '4', 4) REP_SHOP,
MIN(C.SEQ_NO) SEQ_NO,
B.EXTRA_S_8 SHOP_NAME,
SUM(A.SALE_AMT) SALE_TARGET,
SUM(A.REAL_SALE_NOR) REAL_SALE_NOR,
SUM(A.REAL_SALE_GI) REAL_SALE_GI,
SUM(A.REAL_SALE_NOR) + SUM(A.REAL_SALE_GI) DAY_REAL_SALE_AMT,
SUM(A.MON_REAL_SALE_NOR) MON_REAL_SALE_NOR,
SUM(A.MON_REAL_SALE_GI) MON_REAL_SALE_GI,
SUM(A.ON_REAL_SALE_AMT) ON_REAL_SALE_AMT,
SUM(A.MON_REAL_SALE_NOR) + SUM(A.MON_REAL_SALE_GI) TTL_REAL_SALE_AMT,
NVL(SUM(TTL_REAL_SALE_AMT), 0) /
DECODE(SUM(A.SALE_AMT), 0, NULL, SUM(A.SALE_AMT)) * 100 ACHIEVE_PER,
SUM(A.PRE_REAL_SALE_NOR) PRE_REAL_SALE_NOR,
SUM(A.PRE_REAL_SALE_GI) PRE_REAL_SALE_GI,
SUM(A.PRE_REAL_SALE_NOR) + SUM(A.PRE_REAL_SALE_GI) PRE_REAL_SALE_AMT,
SUM(A.PRE_MON_REAL_SALE_NOR) PRE_MON_REAL_SALE_NOR,
SUM(A.PRE_MON_REAL_SALE_GI) PRE_MON_REAL_SALE_GI,
SUM(A.ON_PRE_REAL_SALE_AMT) ON_PRE_REAL_SALE_AMT,
SUM(A.PRE_MON_REAL_SALE_NOR) + SUM(A.PRE_MON_REAL_SALE_GI) TTL_PRE_REAL_SALE_AMT,
NVL((SUM(A.TTL_REAL_SALE_AMT) - SUM(A.TTL_PRE_REAL_SALE_AMT)), 0) /
DECODE(SUM(A.TTL_PRE_REAL_SALE_AMT),
0,
NULL,
SUM(A.TTL_PRE_REAL_SALE_AMT)) * 100 INCREASE_PER,
SUM(A.TTL_REAL_SALE_AMT) / 26 AVG_SALE_AMT,
SUM(A.TTL_PRE_REAL_SALE_AMT) / 26 AVG_PRE_SALE_AMT,
MAX(A.BIGO) BIGO
FROM SHOPLIST A, CLIENTINFO B, SHOPGROUP C
WHERE B.DIVISION_CD = '0'
AND B.CLIENT_GU = 'M'
AND B.CLIENT_CD = A.SHOP_CD
AND C.DIVISION_CD = '0'
AND A.SHOP_CD = C.CLIENT_CD
AND C.SHOPGROUP_CD = '8900'
AND C.SHOPGROUP_GU = '0'
GROUP BY B.EXTRA_S_8, A.REP_SHOP
ORDER BY A.REP_SHOP ASC, MIN(C.SEQ_NO) ASC
1. 정렬 기준 오류
- 오류 : PARTITION BY a.rep_shop ORDER BY a.rep_shop
- 수정 : PARTITION BY a.rep_shop ORDER BY MIN(c.seq_no)
2. 그룹 기준 모호
- MIN(c.seq_no) 를 하고 있는데?
- c.seq_no 를 GROUP BY 에 포함시키고 MIN 을 빼도 결과가 같을 것 같은데? 어떤가요?
3. 결과에 대한 설명 부족 1
- 0136 이라는 특정 코드에 대해서 널처리를 하는건가요?
- 제일 첫번째 코드에 대해서 널처리를 하는건가요?
- 만약 첫번째라고 한다면? 0136 하나만인지? 0150, 0200 도 해당되는 것인지?
4. 결과에 대한 설명 부족 2
- 널처리를 한다면? 나머지 부분은 어떤식으로 출력이 되야 하는지?
- null, 2, 3, 4, 5, ... 인지?
- null, 1, 2, 3, 4, ... 인지?
말씀 감사합니다! 1번 2번은 참고해서 수정해보겠습니다.
3번은 0136이라는 특정 코드에 대해서만 널처리나 공백문자 처리를 하고싶습니다.
4번은 NULL, 1, 2, 3, 4로 표시되게끔 하고싶습니다.
SELECT DECODE(MIN(c.seq_no), '0136', null
, ROW_NUMBER() OVER(PARTITION BY a.rep_shop ORDER BY NULLIF(MIN(c.seq_no), '0136'))
) num,
-- Decode 가 필요한지 의문?
-- DECODE(a.rep_shop, '0', 0, '1', 1, '2', 2, '3', 3, '4', 4) rep_shop,
a.rep_shop,
-- Decode 를 NullIf 로 대체
-- NVL(SUM(a.ttl_real_sale_amt), 0) / DECODE(SUM(a.sale_amt), 0, NULL, SUM(a.sale_amt)) * 100 achieve_per,
NVL(SUM(a.ttl_real_sale_amt), 0) / NULLIF(SUM(a.sale_amt), 0) * 100 achieve_per,
헉 감사합니다. 알려주신대로 적용해보니까 되네요! 앞서 말씀주신 1번 2번도 덕분에 수정했습니다. 감사합니다.
혹시 매겨진 번호가 1, 2, null, 4, 5로 뜨는경우엔 1, 2, null, 3, 4 로 뜨게하려면 어떻게 해야하나요?
해당 코드 제외하고 나머지 코드들 순차적으로 번호 부여되는 쿼리 알려 드린건데요?
혹시 안되나요?
앗 네네 1, 2, NULL, 4, 5 식으로 뜨더라구요 아니면 제 실수일수도 있으니 다시 한번 확인해보겠습니다!
앗 제 실수였던것같아요. 다시 고쳐보니 문제 해결됐습니다! 감사합니다.
적용하신 쿼리 보여주세요.