ГРУППА НА НЕДЕЛЮ с SQL
У меня есть следующее:
http://sqlfiddle.com/#!6/226ae/1
Я пытаюсь добавить одну строку за каждую неделю года и соответствующим образом фильтровать контакты. КОНТАКТЫ имеют столбец datetime. Новая таблица будет выглядеть так:
Status 1 Status 2 Status 3
Week 1 3 4 2
Week 2 1 5 3
Week 3 2 2 4
Я думаю, что DATEADD нужно использовать, однако я не понимаю, как начать изменение моего запроса.
Я знаю, что MySQL имеет команду GROUP BY WEEK, но я не думаю, что SQL имеет эквивалент. Какой лучший способ это сделать?
Ответы
Ответ 1
Вы можете использовать DATEPART()
, эти группы по неделям и годам, если у вас есть данные, охватывающие несколько лет:
SELECT
'Week ' + cast(datepart(wk, created) as varchar(2)) Week,
SUM(case WHEN status = 1 then 1 else 0 end) Status1,
SUM(case WHEN status = 2 then 1 else 0 end) Status2,
SUM(case WHEN status = 3 then 1 else 0 end) Status3,
SUM(case WHEN status = 4 then 1 else 0 end) Status4,
SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by datepart(wk, created), year(created)
Смотрите SQL Fiddle with Demo
Добавление года к окончательному результату:
SELECT
'Week ' + cast(datepart(wk, created) as varchar(2)) Week,
year(created) year,
SUM(case WHEN status = 1 then 1 else 0 end) Status1,
SUM(case WHEN status = 2 then 1 else 0 end) Status2,
SUM(case WHEN status = 3 then 1 else 0 end) Status3,
SUM(case WHEN status = 4 then 1 else 0 end) Status4,
SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by datepart(wk, created), year(created)
Смотрите SQL Fiddle с демонстрацией
Ответ 2
Вы можете использовать функцию datepart
, чтобы извлечь неделю с даты.
Запрос будет выглядеть следующим образом:
SELECT datepart(week, created) as week,
SUM(case WHEN status = 1 then 1 else 0 end) Status1,
SUM(case WHEN status = 2 then 1 else 0 end) Status2,
SUM(case WHEN status = 3 then 1 else 0 end) Status3,
SUM(case WHEN status = 4 then 1 else 0 end) Status4,
SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by datepart(week, created)
SqlFiddle: http://sqlfiddle.com/#!6/226ae/6tsq
Ответ 3
Вы можете попробовать использовать предложение group by в вашем запросе:
SELECT
DATE_FORMAT( created, '%u' ) week_number,
SUM(case WHEN status = 1 then 1 else 0 end) Status1,
SUM(case WHEN status = 2 then 1 else 0 end) Status2,
SUM(case WHEN status = 3 then 1 else 0 end) Status3,
SUM(case WHEN status = 4 then 1 else 0 end) Status4,
SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
GROUP BY DATE_FORMAT( created, '%u' )
Я предполагаю, что вы говорите о mysql.
Функция DATE_FORMAT зарегистрирована здесь:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format