next_day 의 기능 - 아래글에 댓글 추가가 안되어서 0 10 1,233

by 안떠니 [SQL Query] [2018.08.13 13:20:44]


아래 글에 댓글 주신 야신님의 쿼리에서 몇가지를 배웠습니다.

그중에서,

 

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 잘 리턴해 주지만,

왜 그렇게 되는지 궁금해서 질문드려 봅니다.

 

감사합니다.

 

by 안떠니 [2018.08.13 13:22:07]

신기하게 아래 글만 글 수정, 답변채택, 댓글도 안됩니다. 어떤 버튼도 안되더군요.

브라우저는 에짓, 크롬, 익플11 모두 시도해 봐도..댓글등록 창이 보이지를 않고 구글 광고만 자리잡고 있네요.

 

하지만, 지금 이글은 모든 게 정상이구요... 사이트 버그인가요???


by 마농 [2018.08.13 13:57:00]

1. 구문의 의미
  - (-1) 은 하루를 빼겠다는 의미
  - next_day 는 지정한 요일에 해당하는 다음 날짜.
  - 해석 : 어제 날짜 이후 나오는 토요일의 일자.
2. 댓글 오류
  - 야신님께서 달아주신 댓글에 스크립트가 포함되어 있고
  - 해당 스크립트와 구루비 기본 스크립트가 충돌하면서 스크립트 오류 발생 한 듯.


by 마농 [2018.08.13 13:58:00]

이전 글에 댓글을 달 수 없어 여기에 답변 남겨봅니다.

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
;

 


by 우리집아찌 [2018.08.13 14:02:15]

구루비 버그는 저도 처음 보는 버그네요..

일단 next_day ( 날짜 , 'SAT' )  -> 날짜 기준으로 가장 처음 토요일 날짜를 리턴해줍니다.

http://www.gurubee.net/lecture/1026

 


by 안떠니 [2018.08.14 06:35:16]
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이 되면..대략 난감해지는...

이것도 피봇으로 가능한가요?

 

제 생각이 많이 짧았습니다.

 

죄송합니다.


by 안떠니 [2018.08.14 11:41:36]

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 컬럼과 연결을 어떻게 해야할지.. 피봇으로 불가능한 조건인가요?


by 마농 [2018.08.17 10:32:28]

쿼리의 일부분만 올리시고, 구문도 다 틀리게 작성하셨네요.
뭘 하든 쿼리로 가능합니다.
질문을 정리해서 다시 새로 해주세요.


by 마농 [2018.08.17 16:24:34]
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
;

 


by 마농 [2018.08.17 16:33:20]
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
;

 


by 안떠니 [2018.08.17 23:05:47]

위에 있는 쿼리라서 변경이 필요한 부문만 인용했더니, 그게 오히려 마이너스였네요.

위에 코드를 보니, 정말 쿼리는 신세계네요. 지금까지, 기본 데이터가 나오면,

프로그래밍으로 편집해서 추출하고 그랬는데...그래서..더욱 복잡한 쿼리를 쓸 일이 없었습니다.

위의 코드 두개 모두 감사합니다.

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