Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 尝试使用SQL查询获取每天的项目数_Mysql_Sql_Aggregate Functions - Fatal编程技术网

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

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

我有一个数据库,有几天的数据,我想得到每天状态为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行。如果您对如何执行此操作有任何建议,我们将不胜感激。

您正在对
日期和时间
字段进行分组,该字段还包含时间组件。这使得每个记录实际上都是唯一的,因此每个组中都有一个记录

仅在日期分组:

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
(这将截断时间部分)也足够了。