Mysql 尝试使用SQL查询获取每天的项目数
我有一个数据库,有几天的数据,我想得到每天状态为0、状态为1、状态为8的每条记录的计数。我本来想看看这样的东西Mysql 尝试使用SQL查询获取每天的项目数,mysql,sql,aggregate-functions,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
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行。如果您对如何执行此操作有任何建议,我们将不胜感激。您正在对
日期和时间
字段进行分组,该字段还包含时间组件。这使得每个记录实际上都是唯一的,因此每个组中都有一个记录
仅在日期分组:
Group By DATEADD(dd,(DATEDIFF(dd,0,DateAndTime)),0)
Order by DATEADD(dd,(DATEDIFF(dd,0,DateAndTime)),0)
您会感到困惑,因为您更改了一列,并将其命名为与原始列相同的名称。当您说“按日期和时间分组”时,这是指表中的列。假设这是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;
这将更改
选择中别名的名称,以避免混淆。它将别名用于列引用,以澄清查询的含义。而且,它使用cast()
而不是旧的datedd
/datediff
技巧。此外,您已经标记了此MySQL,但根据查询的语法,这是Microsoft SQL Server。它是哪一个?将值强制转换为DATE
(这将截断时间部分)也足够了。