그룹집계 0 7 1,341

by Oracle10g [Oracle 기초] [2017.10.26 11:35:23]


안녕하십니까ㅎㅎ 좋은 아침입니다!! 
제가 특정데이터를 아래 결과데이터 처럼 보여줘야하는데
일단 지금 어찌됬건 값은 나왔습니다..근데 이렇게 해야하나..싶네요..ㅠㅠ

구루비 분들이라면 
더 간단하고 효율적인 방법을 찾으시지 않을까 싶어서 질문드립니다!
이럴경우 그룹을 어떻게 쳐야 하나요?
    
WITH T AS (
SELECT '01' SEQ,  'EN' N_DATA , '01' AS FRNUM,  '02' AS TONUM FROM DUAL UNION ALL
SELECT '02' , 'EN' , '03' , '04' FROM DUAL UNION ALL  
SELECT '03' , 'RN' , '05' , '06' FROM DUAL UNION ALL    
SELECT '04' , 'RN' , '07' , '08' FROM DUAL UNION ALL    
SELECT '05' , ''   , '09' , '10' FROM DUAL UNION ALL    
SELECT '06' , 'TN' , '11' , '12' FROM DUAL UNION ALL    
SELECT '07' , 'EN' , '13' , '14' FROM DUAL UNION ALL    
SELECT '08' , 'EN' , '15' , '16' FROM DUAL UNION ALL    
SELECT '09' , 'RN' , '17' , '18' FROM DUAL UNION ALL    
SELECT '10' , 'RN' , '19' , '20' FROM DUAL)   

SELECT * FROM T ;


/* 희망결과값 

   N_DATA  FRNUM   TONUM
    ---    ----    ----   
    EN      01      04
    ---    ----    ----
    RN      05      08
    ---    ----    ----
    TN      11      12
    ---    ----    ----
    EN      13      16
    ---    ----    ----
    RN      17      20
*/

 

by 우리집아찌 [2017.10.26 11:48:13]
-- 수정했습니다.
WITH T AS (
SELECT '01' SEQ,  'EN' N_DATA , '01' AS FRNUM,  '02' AS TONUM FROM DUAL UNION ALL
SELECT '02' , 'EN' , '03' , '04' FROM DUAL UNION ALL 
SELECT '03' , 'RN' , '05' , '06' FROM DUAL UNION ALL   
SELECT '04' , 'RN' , '07' , '08' FROM DUAL UNION ALL   
SELECT '05' , ''   , '09' , '10' FROM DUAL UNION ALL   
SELECT '06' , 'TN' , '11' , '12' FROM DUAL UNION ALL   
SELECT '07' , 'EN' , '13' , '14' FROM DUAL UNION ALL   
SELECT '08' , 'EN' , '15' , '16' FROM DUAL UNION ALL   
SELECT '09' , 'RN' , '17' , '18' FROM DUAL UNION ALL   
SELECT '10' , 'RN' , '19' , '20' FROM DUAL)   
 
SELECT N_DATA , MIN(FRNUM) , MAX(TONUM) 
   FROM (SELECT A.* 
              , ROW_NUMBER() OVER(PARTITION BY N_DATA ORDER BY SEQ) -TO_NUMBER(SEQ) GB
           FROM T A 
          WHERE N_DATA IS NOT NULL
        )
   GROUP BY N_DATA , GB      
   ORDER BY MAX(TO_NUMBER(SEQ))

 


by Oracle10g [2017.10.26 12:00:43]


아...감사합니다..저도 이런 쿼리에 좀 익숙해 져야할 것 같네요 ㅠㅠ
어디서부터 시작해서 공부해야 이런쿼리가 슉슉 나올까요? ㅠㅠ감사합니다!


by 우리집아찌 [2017.10.26 13:05:30]

마농님 것을 열심히 공부하면 실력이 많이 좋아지실겁니다.

 


by 마농 [2017.10.26 13:16:26]

GROUP BY 에 n_data 가 추가되어야 합니다.


by Oracle10g [2017.10.26 13:21:20]

감사합니다 아찌님! 마농님! 매번 도움 받고가서 항상 감사한 마음 가지고있습니다~~

좋은하루되십시요!!


by 마농 [2017.10.26 13:07:29]
SELECT n_data
     , MIN(frnum) frnum
     , MAX(tonum) tonum
  FROM (SELECT seq, n_data, frnum, tonum
             , ROW_NUMBER() OVER(ORDER BY seq)
             - ROW_NUMBER() OVER(PARTITION BY n_data ORDER BY seq) gb
          FROM t
        )
 WHERE n_data IS NOT NULL
 GROUP BY n_data, gb
 ORDER BY frnum
;

 


by 고수가되고싶어요 [2017.12.13 14:19:42]
SELECT n_data,MIN(frnum),MAX(tonum) 
FROM(
SELECT n_data
	  ,frnum
      ,tonum
      ,flag
      ,SUM(flag) OVER(ORDER BY frnum) flag2 
FROM(
SELECT n_data
	  ,frnum
      ,tonum
      ,CASE WHEN n_data =LEAD(n_data) OVER(ORDER BY frnum) THEN 1 
      		WHEN LAG(n_data) OVER(ORDER BY frnum) IS NULL THEN 1 ELSE 0 END flag
      
FROM t )
WHERE n_data IS NOT NULL )
GROUP BY n_data,flag2 
ORDER BY flag2

 

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