Как упомянул jarlh:
Создать список недель:
SELECT TO_CHAR(LEVEL, 'FM00')||'/2018' wk
FROM dual
CONNECT BY LEVEL <= 53
Этот запрос генерирует 53 строки, а уровень - это просто число .. 1 .. 2 .. upto53. Мы форматируем его так, чтобы он стал 01/2018, 02/2018. 53/2018
Если вы планируете использовать этот запрос в другие годы, лучше сделать динамический год:
SELECT TO_CHAR(LEVEL, 'FM00')||TO_CHAR(sysdate-7/24,'/YYYY') wk
FROM dual
CONNECT BY LEVEL <= 53
(Кредит Барбаросу за указание на то, что Oracle сообщает, что последний день любого года относится к 53-й неделе, или как-то иначе 7 * 52 = 364)
Мы присоединились кзаписывает данные на него.Я не совсем понял, почему вы вычли 7 часов из даты (часовой пояс?), Но я оставил это.Я убрал сложность подсчета, так как вы, кажется, хотите, чтобы подсчет только записей за определенную неделю.Я также удалил двойной to_char, потому что вы можете сделать все это за одну операцию.Не нужно TO_CHAR(date, 'WW')||'/'||TO_CHAR(date,'YYYY')
и т. Д. Вы просто добавляете WW/YYYY
в качестве формата.Наш запрос теперь выглядит следующим образом:
SELECT lst.wk as week, COALESCE(amt, 0) as amount FROM
(
SELECT TO_CHAR(LEVEL, 'FM00')||TO_CHAR(sysdate-7/24,'/YYYY') wk
FROM dual
CONNECT BY LEVEL <= 52
) lst
LEFT OUTER JOIN
(
SELECT
to_char(Note_created_on - 7/24,'ww/yyyy') as wk,
COUNT(*) as amt
FROM Notes
GROUP BY to_char(Note_created_on - 7/24,'ww/yyyy')
) dat
ON lst.wk = dat.wk
ORDER BY lst.wk
В течение нескольких недель, когда нет примечаний, левое объединение записывает нулевое значение по отношению к этой неделе, поэтому мы объединяем его, чтобы сделать его равным 0.
Вы можете, конечно, выполнить запрос другими способами (многими способами), вот сравнение:
SELECT lst.wk as week, COUNT(dat.wk) as amount FROM
(
SELECT TO_CHAR(LEVEL, 'FM00')||TO_CHAR(sysdate-7/24,'/YYYY') wk
FROM dual
CONNECT BY LEVEL <= 52
) lst
LEFT OUTER JOIN
(
SELECT
to_char(Note_created_on - 7/24,'ww/yyyy') as wk
FROM Notes
) dat
ON lst.wk = dat.wk
GROUP BY lst.wk
ORDER BY lst.wk
В этой форме мы делаем groupby / count после объединения.Подсчитав dat.wk, который для некоторого lst.wk может быть равен NULL, мы можем опустить объединение, потому что count (null) равно 0