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