【问题标题】:GROUP BY WEEK with SQL使用 SQL 按周分组
【发布时间】:2012-11-07 21:28:08
【问题描述】:

我有以下几点:

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

【问题讨论】:

  • 我觉得你的问题不够清楚
  • 刚刚添加了更多细节 - 这有帮助吗?

标签: sql tsql


【解决方案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 with demo

【讨论】:

  • 这正是我想要的。谢谢蓝脚
  • 来自 MSDN 我使用的是不支持 SET DATEFIRST 1 的 DATEDIFF 方法;这个答案正确地支持星期的第一天。
【解决方案2】:

您可以使用the datepart function 从日期中提取星期。

查询变为:

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

    【讨论】:

    • 问题是关于 TSQL (SQL Server),而不是 MySQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多