Группировка по неделям с 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