尝试使用SQL查询获取每天的项目数

时间:2014-08-19 20:46:35

标签: mysql sql aggregate-functions

我有一个带有几天数据的数据库,我希望每天记录状态= 0,状态= 1 ...状态= 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行。任何关于如何做到这一点的建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

您正在DateAndTime字段进行分组,该字段还包含时间组件。这使得每条记录几乎都是唯一的,因此每组中都会有一条记录。

仅限日期的小组:

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

答案 1 :(得分:0)

您感到困惑,因为您更改了一个列并为其指定了与原始列相同的名称。当您说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技巧。