아래 글에 댓글 주신 야신님의 쿼리에서 몇가지를 배웠습니다.
그중에서,
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 잘 리턴해 주지만,
왜 그렇게 되는지 궁금해서 질문드려 봅니다.
감사합니다.
신기하게 아래 글만 글 수정, 답변채택, 댓글도 안됩니다. 어떤 버튼도 안되더군요.
브라우저는 에짓, 크롬, 익플11 모두 시도해 봐도..댓글등록 창이 보이지를 않고 구글 광고만 자리잡고 있네요.
하지만, 지금 이글은 모든 게 정상이구요... 사이트 버그인가요???
1. 구문의 의미
- (-1) 은 하루를 빼겠다는 의미
- next_day 는 지정한 요일에 해당하는 다음 날짜.
- 해석 : 어제 날짜 이후 나오는 토요일의 일자.
2. 댓글 오류
- 야신님께서 달아주신 댓글에 스크립트가 포함되어 있고
- 해당 스크립트와 구루비 기본 스크립트가 충돌하면서 스크립트 오류 발생 한 듯.
이전 글에 댓글을 달 수 없어 여기에 답변 남겨봅니다.
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
;
위에 있는 쿼리라서 변경이 필요한 부문만 인용했더니, 그게 오히려 마이너스였네요.
위에 코드를 보니, 정말 쿼리는 신세계네요. 지금까지, 기본 데이터가 나오면,
프로그래밍으로 편집해서 추출하고 그랬는데...그래서..더욱 복잡한 쿼리를 쓸 일이 없었습니다.
위의 코드 두개 모두 감사합니다.