13

我有以下内容:

http://sqlfiddle.com/#!6/226ae/1

我现在尝试为一年中的每一周添加一行,并相应地过滤联系人。CONTACTS 有一个日期时间列。新表将如下所示:

        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 有一个等价的命令。实现这一目标的最佳方法是什么?

4

3 回答 3

37

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

将年份添加到最终结果中:

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

于 2012-11-07T21:49:34.437 回答
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

于 2012-11-07T21:46:30.173 回答
0

您可以尝试在查询中使用 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

于 2012-11-07T21:39:12.067 回答