ROW_NUMBER()에서 특정 조건만 번호를 매기지 않는법 질문 0 8 1,438

by 초보 [SQL Query] [2022.01.26 12:06:02]


결과.PNG (14,154Bytes)

안녕하세요! 아래와 같은 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

 

by 마농 [2022.01.26 13:12:02]

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, ... 인지?


by 초보 [2022.01.26 13:27:16]

말씀 감사합니다! 1번 2번은 참고해서 수정해보겠습니다.

3번은 0136이라는 특정 코드에 대해서만 널처리나 공백문자 처리를 하고싶습니다.

4번은 NULL, 1, 2, 3, 4로 표시되게끔 하고싶습니다.


by 마농 [2022.01.26 13:49:54]
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,

 


by 초보 [2022.01.26 14:39:11]

헉 감사합니다. 알려주신대로 적용해보니까 되네요! 앞서 말씀주신 1번 2번도 덕분에 수정했습니다. 감사합니다.

혹시 매겨진 번호가 1, 2, null, 4, 5로 뜨는경우엔 1, 2, null, 3, 4 로 뜨게하려면 어떻게 해야하나요? 


by 마농 [2022.01.26 14:50:18]

해당 코드 제외하고 나머지 코드들 순차적으로 번호 부여되는 쿼리 알려 드린건데요?
혹시 안되나요?


by 초보 [2022.01.26 15:00:32]

앗 네네 1, 2, NULL, 4, 5 식으로 뜨더라구요 아니면 제 실수일수도 있으니 다시 한번 확인해보겠습니다!


by 초보 [2022.01.26 15:39:38]

앗 제 실수였던것같아요. 다시 고쳐보니 문제 해결됐습니다! 감사합니다.


by 마농 [2022.01.26 15:05:22]

적용하신 쿼리 보여주세요.

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