안녕하세요 테이블 하나에서 몇가지의 컬럼으로 1월에서 12월 까지의 통계를 내는 쿼리를 작성하고 있습니다. 0 2 701

by soohoin12 [SQL Query] [2017.12.04 00:16:49]


제가 가장 궁금한 내용은 

union all 이  성능에 매우 안좋은지 너무 궁금합니다.
 

제가 union all 을 2번정도 사용해야 하는 상황입니다.

총 5개의 내용을 12개월로 나눠서 통계를 내야 하는데 
3개의 Row는 같은 컬럼이라서  메인쿼리 + 서브쿼리 + case when + sum + group by 를   사용해서  통계를 낸후  (열과 행을 변경햐주는 작업을 했습니다.)

그리고 나머지는 각각 다른 컬럼이라서  아무리 생각해도 하나의 쿼리로 나올수 없다고 생각이 드는데요 ㅠㅠ 그래서  쿼리를 1개나 2개 더 작성해서 
UNION ALL 로 합쳐주려고합니다.
그런데 제가 초보라 그런지 자꾸  UNION ALL을 사용하지 말라고 하네요 제 쿼리ㅣ를 제대로 보지도않고여... 
자기는 OUTER JOIN을 사용해서 한다는데... OUTER JOIN을 사용하지 않은 제 쿼리가 더 효과적이지 않을까요?? 
제가 3개의 통개를낸 쿼리만 올려 보겠습니다.
정확한 쿼리를 오리진 못하지만  ㅠㅠ 
개떡같은 설명에  찰떡같이 답해주실  고수님 계시면 감사하겠습니다!!! 

UNION ALL 이  ㅠㅠ  그렇게 나쁜가요 ;; 
반복코드는 거의다 뻇는데... ㅠㅠㅠ   
통계는  1월에서  12월까지 쭉~  나열되고여 
ROW는   총 5섯개로  나오게 되는  정적인  통계입니다......  


WITH TABLE1 AS
(
SELECT '0' COL1, '20170901' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '3' COL1, '20171101' COLDT, '2' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170701' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170401' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '2' COL1, '20170301' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170101' COLDT, '2' COL2 FROM DUAL
UNION ALL
SELECT '2' COL1, '20170101' COLDT, '2' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20171201' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20171101' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '1' COL1, '20171001' COLDT, '2' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170901' COLDT, '2' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170801' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '1' COL1, '20170701' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170601' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170501' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '1' COL1, '20170401' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170301' COLDT, '1' COL2 FROM DUAL
UNION ALL
SELECT '0' COL1, '20170201' COLDT, '3' COL2 FROM DUAL
UNION ALL
SELECT '2' COL1, '20170101' COLDT, '3' COL2 FROM DUAL
)

SELECT 
       SUM(CASE WHEN BASE_DT = '201701' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END)
                                    0 END) AS M1
     , SUM(CASE WHEN BASE_DT = '201702' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END)
                                    0 END) AS M2  
                                                                     
     , SUM(CASE WHEN BASE_DT = '201703' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END)
                                    0 END) AS M3  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201704' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END)
                                    0 END) AS M4  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201705' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END) 
                                    0 END) AS M5  
                                                                     
     , SUM(CASE WHEN BASE_DT = '201706' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END)
                                    0 END)  AS M6  
                                                                     
     , SUM(CASE WHEN BASE_DT = '201707' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1  END)
                                    0 END)  AS M7  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201708' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END) 
                                    0 END)    AS M8  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201709' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END) 
                                    0 END)    AS M9 
                                                                      
     , SUM(CASE WHEN BASE_DT = '201710' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END) 
                                    0 END)    AS M10  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201711' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END) 
                                        0 END ) AS M11  
                                                                      
     , SUM(CASE WHEN BASE_DT = '201712' THEN (CASE WHEN A.ONE = 1 THEN 1 
                                               WHEN A.TWO = 1 THEN 1
                                               WHEN A.THREE = 1 THEN 1 END)
                                        0 END) AS M12                                                                                                                                               
  FROM 
      (
      SELECT COLDT AS BASE_DT
           , (CASE WHEN COL2 = '3' THEN 1 ELSE 0 END) ONE
           , (CASE WHEN COL2 = '2' THEN 1 ELSE 0 END) TWO
           , (CASE WHEN COL2 = '1' THEN 1 ELSE 0 END) THREE
       FROM TABLE1
      ) A
 WHERE 1=1      
 GROUP BY A.ONE
        , A.TWO
        , A.THREE;
 
 
 

    
      


 

 

 

 

by 마농 [2017.12.04 09:11:39]

UNION ALL 이 나쁜게 아니라, 불필요한 UNION ALL 을 사용하는게 나쁜거죠.
UNION ALL 에 대한 질문을 하면서 UNION ALL 예시는 안올리셨네요.
사용하신 UNION ALL 이 불필요한지 아닌지 판단을 할 수 없네요.
우선 올리신 쿼리만 보면
CASE 절에서 조건처리를 모두 하는데...
WHERE 절에서 미리 조건을 주어 자료를 걸러낼 필요가 있습니다.
불필요한 부분이 많이 보이며 정확한 쿼리가 아닌것 같습니다.
정확한 쿼리를 올려주세요.
union all 부분도 올려 주세요.

SELECT col2
     , CASE WHEN col2 = '3' THEN 1 ELSE 0 END one
     , CASE WHEN col2 = '2' THEN 1 ELSE 0 END two
     , CASE WHEN col2 = '1' THEN 1 ELSE 0 END three
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '01' THEN 1 END) m01
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '02' THEN 1 END) m02
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '03' THEN 1 END) m03
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '04' THEN 1 END) m04
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '05' THEN 1 END) m05
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '06' THEN 1 END) m06
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '07' THEN 1 END) m07
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '08' THEN 1 END) m08
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '09' THEN 1 END) m09
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '10' THEN 1 END) m10
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '11' THEN 1 END) m11
     , COUNT(CASE WHEN SUBSTR(coldt, 5, 2) = '12' THEN 1 END) m12
  FROM table1
 WHERE coldt LIKE '2017%'
   AND col2 IN ('1', '2', '3')
 GROUP BY col2
 ORDER BY col2 DESC
;

 


by soohoin12 [2017.12.10 03:19:19]

너무 감사합니다 ㅠㅠ  where 조건절 에서 걸러내고 검색하는게 엄청 좋겠네요 ㅠㅠ  쌩초보라서 그런생각이 아직 짧네요 ;; 

제가 너무너무나 궁금 했던 부분이 있습니다  

오라클 행과 열을 바꾸는 부분인데요  
제가 데이터는 월별로 모두 뽑았는데요 

총 5개의 컬럼으로 뽑았습니다.

그런데  행과 열을 바꿔서 보려고 하는데 (월이 위로가고  컬럼이 왼쪽으로 5개가 와야됩니다. )
하나의 컬럼은 행과열을 바꾸기 쉬웠는데요   다섯개를 바꾸려고하니  ㅠㅠ 머리를 굴려봐도 제 머리로는 한계가 있네요 ㅠㅠ 

구분년월      col1     col2    col3    col4    col5

  201701       1         2         1        5       3

  201702       0         1         1        3       0

  201703       2         2         3       4       1

  201704       0         1         0       3       4

  201705       2         3         1       1       2

  201706       1         0         1       0       3

  .................................

 

 

 

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