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;
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 ;
너무 감사합니다 ㅠㅠ 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
.................................