Значение TO_CHAR(DAYOFYEAR, 'd')
зависит от значения параметра NLS_TERRITORY.
У вас есть 2 варианта:
Опция 1 Установите для параметра NLS_TERRITORY значение, для которого установлен понедельник.рассматривается как 1-й день (например, «СОЕДИНЕННОЕ КОРОЛЕВСТВО») и выполнить запрос ниже (SUM(DECODE(WDAY,
был скорректирован):
ALTER SESSION SET NLS_TERRITORY = 'UNITED KINGDOM';
SELECT CASE
WHEN (NEW_YWEEK = MIN(NEW_YWEEK)
OVER(PARTITION BY MON ORDER BY NEW_YWEEK)) THEN
MON_NAME
ELSE
MON_NAME
END AS MONTH,
-- NEW_YWEEK AS YWEEK,
ROW_NUMBER() OVER(PARTITION BY MON ORDER BY NEW_YWEEK) AS MWEEK,
SUM(DECODE(WDAY, '1', MDAY, NULL)) AS MON,
SUM(DECODE(WDAY, '2', MDAY, NULL)) AS TUE,
SUM(DECODE(WDAY, '3', MDAY, NULL)) AS WED,
SUM(DECODE(WDAY, '4', MDAY, NULL)) AS THU,
SUM(DECODE(WDAY, '5', MDAY, NULL)) AS FRI,
SUM(DECODE(WDAY, '6', MDAY, NULL)) AS SAT,
SUM(DECODE(WDAY, '7', MDAY, NULL)) AS SUN
FROM (SELECT DAYOFYEAR AS EVERYDAY,
TO_CHAR(DAYOFYEAR, 'mm') AS MON,
TO_CHAR(DAYOFYEAR, 'Month') AS MON_NAME,
TO_CHAR(DAYOFYEAR, 'w') AS MWEEK,
TO_CHAR(DAYOFYEAR, 'ww') AS YWEEK,
CASE
WHEN (TO_CHAR(TO_DATE(&YEAR || '0101', 'yyyymmdd'), 'd') > '1') AND
(TO_CHAR(DAYOFYEAR, 'd') <
TO_CHAR(TO_DATE(&YEAR || '0101', 'yyyymmdd'), 'd')) THEN
TO_CHAR(TO_CHAR(DAYOFYEAR, 'ww') + 1, 'fm00')
ELSE
TO_CHAR(DAYOFYEAR, 'ww')
END AS NEW_YWEEK,
TO_CHAR(DAYOFYEAR, 'd') AS WDAY,
/*decode(
TO_CHAR(DAYOFYEAR, 'd') ,
'2','1','3','2','4','3','5','4' ,'6','5','7','6' ,'7' )AS WDAY,*/
TO_CHAR(DAYOFYEAR, 'dd') AS MDAY
FROM (SELECT TO_DATE(&YEAR || '0101', 'yyyymmdd') + LEVEL -1 AS DAYOFYEAR
FROM DUAL
CONNECT BY LEVEL <=
TO_CHAR(TO_DATE(&YEAR || '1231', 'yyyymmdd'),
'ddd'))
--where TO_CHAR(DAYOFYEAR, 'Month') = 'November'
)
GROUP BY MON, MON_NAME, NEW_YWEEK;
Опция 2 Не трогать параметр NLS_TERRITORY и выполнитьзапрос ниже (SUM(DECODE(WDAY,
был скорректирован и изменен способ вычисления значения WDAY
):
SELECT CASE
WHEN (NEW_YWEEK = MIN(NEW_YWEEK)
OVER(PARTITION BY MON ORDER BY NEW_YWEEK)) THEN
MON_NAME
ELSE
MON_NAME
END AS MONTH,
-- NEW_YWEEK AS YWEEK,
ROW_NUMBER() OVER(PARTITION BY MON ORDER BY NEW_YWEEK) AS MWEEK,
SUM(DECODE(WDAY, '1', MDAY, NULL)) AS MON,
SUM(DECODE(WDAY, '2', MDAY, NULL)) AS TUE,
SUM(DECODE(WDAY, '3', MDAY, NULL)) AS WED,
SUM(DECODE(WDAY, '4', MDAY, NULL)) AS THU,
SUM(DECODE(WDAY, '5', MDAY, NULL)) AS FRI,
SUM(DECODE(WDAY, '6', MDAY, NULL)) AS SAT,
SUM(DECODE(WDAY, '7', MDAY, NULL)) AS SUN
FROM (SELECT DAYOFYEAR AS EVERYDAY,
TO_CHAR(DAYOFYEAR, 'mm') AS MON,
TO_CHAR(DAYOFYEAR, 'Month') AS MON_NAME,
TO_CHAR(DAYOFYEAR, 'w') AS MWEEK,
TO_CHAR(DAYOFYEAR, 'ww') AS YWEEK,
CASE
WHEN (TO_CHAR(TO_DATE(&YEAR || '0101', 'yyyymmdd'), 'd') > '1') AND
(TO_CHAR(DAYOFYEAR, 'd') <
TO_CHAR(TO_DATE(&YEAR || '0101', 'yyyymmdd'), 'd')) THEN
TO_CHAR(TO_CHAR(DAYOFYEAR, 'ww') + 1, 'fm00')
ELSE
TO_CHAR(DAYOFYEAR, 'ww')
END AS NEW_YWEEK,
DECODE(MOD(TO_CHAR(DAYOFYEAR, 'd')-1, 7), 0,7, TO_CHAR(DAYOFYEAR, 'd')-1) AS WDAY,
/*decode(
TO_CHAR(DAYOFYEAR, 'd') ,
'2','1','3','2','4','3','5','4' ,'6','5','7','6' ,'7' )AS WDAY,*/
TO_CHAR(DAYOFYEAR, 'dd') AS MDAY
FROM (SELECT TO_DATE(&YEAR || '0101', 'yyyymmdd') + LEVEL -1 AS DAYOFYEAR
FROM DUAL
CONNECT BY LEVEL <=
TO_CHAR(TO_DATE(&YEAR || '1231', 'yyyymmdd'),
'ddd'))
--where TO_CHAR(DAYOFYEAR, 'Month') = 'November'
)
GROUP BY MON, MON_NAME, NEW_YWEEK;