아래 글에 댓글 주신 야신님의 쿼리에서 몇가지를 배웠습니다.
그중에서,
select next_day(to_date('07/07/2018','mm/dd/yyyy')-1,'SAT') from dual;
위에서 -1 의 의미를 잘 모르겠습니다.
07/01/2018 부터 07/06/2018 까지는 -1 없어도 07/07/2018 이 리턴되지만,
07/07/2018 은 -1 이 없으면 07/14/2018 이 리턴되더군요.
결과를 바탕으로 -1 이 07/01 부터 07/07 까지를 07/07 잘 리턴해 주지만,
왜 그렇게 되는지 궁금해서 질문드려 봅니다.
감사합니다.
이전 글에 댓글을 달 수 없어 여기에 답변 남겨봅니다.
WITH sales(s_cd, atime, group1, group2, price) AS ( SELECT 1000, '07/01/2018', 100, 1, 10 FROM dual UNION ALL SELECT 1000, '07/04/2018', 100, 2, 1 FROM dual UNION ALL SELECT 1000, '07/07/2018', 102, 1, 2 FROM dual UNION ALL SELECT 1000, '07/08/2018', 102, 2, 20 FROM dual UNION ALL SELECT 1000, '07/11/2018', 103, 1, 12 FROM dual UNION ALL SELECT 1000, '07/14/2018', 103, 2, 5 FROM dual UNION ALL SELECT 1000, '07/15/2018', 104, 1, 3 FROM dual UNION ALL SELECT 1000, '07/18/2018', 104, 2, 1 FROM dual UNION ALL SELECT 1000, '07/21/2018', 105, 1, 6 FROM dual UNION ALL SELECT 1000, '07/22/2018', 105, 2, 8 FROM dual UNION ALL SELECT 1000, '07/25/2018', 106, 1, 4 FROM dual UNION ALL SELECT 1000, '07/28/2018', 106, 2, 1 FROM dual ) SELECT * FROM (SELECT TO_CHAR(TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') + 6, 'mm/dd/yyyy') weekend , price FROM sales ) PIVOT (COUNT(*) FOR price IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 , 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 , 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 , 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 , 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 , 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 , 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 , 101, 102, 103, 104, 105, 106, 107, 108, 109, 110 , 111, 112, 113, 114, 115, 116, 117, 118, 119, 120 , 121, 122, 123, 124, 125, 126, 127, 128, 129, 130 , 131, 132, 133, 134, 135, 136, 137, 138, 139, 140 , 141, 142, 143, 144, 145, 146, 147, 148, 149, 150 , 151, 152, 153, 154, 155, 156, 157, 158, 159, 160 , 161, 162, 163, 164, 165, 166, 167, 168, 169, 170 , 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 , 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 , 191, 192, 193, 194, 195, 196, 197, 198, 199, 200 ) ) ORDER BY weekend ;
구루비 버그는 저도 처음 보는 버그네요..
일단 next_day ( 날짜 , 'SAT' ) -> 날짜 기준으로 가장 처음 토요일 날짜를 리턴해줍니다.
http://www.gurubee.net/lecture/1026
SELECT TO_CHAR(TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') + 6, 'mm/dd/yyyy') weekend , price FROM sales GROUP BY ROLLUP(weekend)
넣고, PIVOT 에
, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200 , -1 as Total) )
google 검색해서 이처럼 했더니, 에러는 없이 툴팁 커멘트에 SELECT
문에 group by 를 수정하라는 말만 나오는데, 어떻게 컬럼 마지막에 합계를 넣을 수가 있을까요?
그리고, 출력 결과물을 보고 있으니,
컬럼이 주간별이 되고, 행이 판매 가격 1부터 200 이 되어서 출력하는게 더 맞을 듯 보입니다,
1년을 조회하더라도, 52주, 즉 52 컬럼이면 되는데.
가격을 컬럼으로 하면, 가격대가 1 부터 200이 아니라, 2000이 되면..대략 난감해지는...
이것도 피봇으로 가능한가요?
제 생각이 많이 짧았습니다.
죄송합니다.
SELECT * FROM
(SELECT TO_CHAR(TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') + 6, 'mm/dd/yyyy') weekend ,
price FROM sales )
PIVOT (COUNT(price) FOR atime IN ( SELECT TO_CHAR(TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') + 6, 'mm/dd/yyyy') weekend )
IN ( 컬럼.... ) 에서 컬럼을 SELECT 문으로 주말의 날짜를 가져오는걸 해봤지만, missing expression 이라고 에러가 나오네요. 에러가 나오지 않더라도, price 컬럼과 연결을 어떻게 해야할지.. 피봇으로 불가능한 조건인가요?
SELECT * FROM (SELECT TO_CHAR(TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') + 6, 'mm/dd/yyyy') weekend , price price1 , -1 price2 FROM sales ) UNPIVOT (price FOR gb IN (price1, price2)) PIVOT (COUNT(gb) FOR price IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 , 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 , 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 , 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 , 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 , 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 , 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 , 101, 102, 103, 104, 105, 106, 107, 108, 109, 110 , 111, 112, 113, 114, 115, 116, 117, 118, 119, 120 , 121, 122, 123, 124, 125, 126, 127, 128, 129, 130 , 131, 132, 133, 134, 135, 136, 137, 138, 139, 140 , 141, 142, 143, 144, 145, 146, 147, 148, 149, 150 , 151, 152, 153, 154, 155, 156, 157, 158, 159, 160 , 161, 162, 163, 164, 165, 166, 167, 168, 169, 170 , 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 , 181, 182, 183, 184, 185, 186, 187, 188, 189, 190 , 191, 192, 193, 194, 195, 196, 197, 198, 199, 200 , -1 AS total ) ) ORDER BY weekend ;
SELECT * FROM (SELECT price , ( TRUNC(TO_DATE(atime, 'mm/dd/yyyy'), 'd') - TRUNC(TO_DATE('201801', 'yyyymm'), 'd') ) / 7 + 1 week1 , -1 week2 FROM sales WHERE atime LIKE '%2018' ) UNPIVOT (week FOR gb IN (week1, week2)) PIVOT (COUNT(gb) FOR week IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 , 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 , 51, 52, 53 , -1 AS total ) ) ORDER BY price ;