ГРУППА НА НЕДЕЛЮ с 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