【问题标题】:Trying to get the count of items per day with SQL query尝试使用 SQL 查询获取每天的项目数
【发布时间】:2014-08-19 20:46:35
【问题描述】:

我有一个包含几天数据的数据库,我想获取每天 Status=0、Status=1...Status=8 的每条记录的计数。我是来看看类似的。

DateAndTime      State_0    State_1   State_2
2014-08-15           5          8        9
2014-08-16           2          5        6
2014-08-17           4          2        3

我正在尝试这个:

   SELECT DISTINCT DATEADD(dd,(DATEDIFF(dd,0,DateAndTime)),0) AS DateAndTime,
       SUM( Case When State=0 Then 1 Else 0 End) AS State_0,
       SUM( Case When State=1 Then 1 Else 0 End) AS State_1,
       SUM( Case When State=2 Then 1 Else 0 End) AS State_2
           FROM [DB_002].[dbo].[MyDb]
   Group By DateAndTime
   Order by DateAndTime

但它不断为我添加的每个状态添加行。那就是 3 个州,每个日期我得到 4 行。任何有关如何执行此操作的建议将不胜感激。

【问题讨论】:

  • 另外,您已经标记了这个 MySQL,但根据查询的语法,这是 Microsoft SQL Server。是哪个?

标签: mysql sql aggregate-functions


【解决方案1】:

您正在对DateAndTime 字段进行分组,该字段还包含时间组件。这使得每条记录实际上都是独一无二的,因此每个组中都会有一条记录。

仅在日期分组:

Group By DATEADD(dd,(DATEDIFF(dd,0,DateAndTime)),0)
Order by DATEADD(dd,(DATEDIFF(dd,0,DateAndTime)),0)

【讨论】:

  • 将值转换为DATE 也可能足够了(这应该会截断时间部分)。
【解决方案2】:

您很困惑,因为您更改了一个列并为其赋予了与原始列相同的名称。当您说group by DateAndTime 时,指的是表中的列。假设这是 SQL Server,我会将查询编写如下:

   SELECT cast(d.DateAndTime as Date) as DateAndNoTime,
          SUM(Case When d.State = 0 Then 1 Else 0 End) AS State_0,
          SUM(Case When d.State = 1 Then 1 Else 0 End) AS State_1,
          SUM(Case When d.State = 2 Then 1 Else 0 End) AS State_2
   FROM [DB_002].[dbo].[MyDb] d
   Group By cast(d.DateAndTime as Date)
   Order by DateAndNoTime;

这会更改select 中的别名名称以避免混淆。它使用列引用的别名,以阐明查询的含义。而且,它使用cast() 代替旧的datedd/datediff 技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多