Группировка по неделям с 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 имеет эквивалент. Как лучше всего этого добиться?
3 ответов
можно использовать 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 возиться с демо
добавление года к окончательному результату:
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 возиться с демо
можно использовать на 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
вы можете попробовать использовать предложение 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 документирована here:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format