2017-08-03 102 views
1

我有这样的一个表:从每小时数据使用SQL GROUP每日数据BY

fld_id   fld_DateTime     fld_Index 
      2017-07-01 00:00:00.000    5 
      2017-07-01 01:00:00.000    10 
      2017-07-01 02:00:00.000    15 
      2017-07-01 03:00:00.000    40 
       ........... 
       ........... 
      2017-07-01 23:00:00.000    70 
      2017-07-02 00:00:00.000    110 
      2017-07-02 01:00:00.000    140 
      2017-07-02 02:00:00.000    190 
       ............... 
       ............... 
      2017-07-02 23:00:00.000    190 

我所试图做的是将它们分组和计数,每天fld_index的总和,像这样:

fld_id   fld_DateTime     SUM 
        2017-07-01      190 
        2017-07-02      400 

这是我已经试过:

SELECT fld_dateTime, SUM(fld_Index) AS Sum 
FROM tbl_data 
WHERE 
    AND fld_ConsDateTime BETWEEN '2017-07-01' AND '2017-08-02' 
GROUP BY fld_dateTime 

它计算总和,但仍然在每小时格式。如何实现上述例子的日常格式?

UPDATE月部分输出

2017 8 30630800.0000 
2017 7 589076201.1800 
+0

我删除了不兼容的数据库类型。请仅使用您真正使用的数据库进行标记。 –

回答

5

简单地铸造为DATE

SELECT CAST(fld_dateTime AS DATE) AS fld_Date, SUM(fld_Index) AS Sum 
FROM tbl_data 
WHERE 
    fld_ConsDateTime BETWEEN '2017-07-01' AND '2017-08-02' 
GROUP BY CAST(fld_dateTime AS DATE); 

编辑:

什么一个月?它是一样的逻辑吗?

这取决于你的RDBMS,但在SQL Server中,你可以使用:

SELECT YEAR(fld_dateTime), MONTH(fld_dateTime), SUM(fld_Index) AS Sum 
FROM tbl_data 
GROUP BY YEAR(fld_dateTime), MONTH(fld_dateTime); 

增加一年的一部分,以避免不同年份分组的记录是非常重要的。

+1

我会在派生表中执行CAST部分,以完全符合ANSI SQL。 – jarlh

+1

月份呢?它是一样的逻辑吗? – FreshPro

+1

@FreshPro逻辑相同,使用函数在'SELECT'和'GROUP BY'部分中提取'YEAR'和'MONTH'部分。 – lad2025

3

您需要提取日期。在SQL Server中,你会怎么做:

SELECT CAST(fld_dateTime as DATE) as fld_date, SUM(fld_Index) AS Sum 
FROM tbl_data 
WHERE fld_ConsDateTime >= '2017-07-01' AND 
     fld_ConsDateTime < '2017-08-03' 
GROUP BY CAST(fld_dateTime as DATE) 
ORDER BY fld_date 

在MySQL中,上述的工作,但我会做到:

SELECT DATE(fld_dateTime) as fld_date, SUM(fld_Index) AS Sum 
FROM tbl_data 
WHERE fld_ConsDateTime >= '2017-07-01' AND 
     fld_ConsDateTime < '2017-08-03' 
GROUP BY DATE(fld_dateTime) 
ORDER BY fld_date; 

在这两种情况下,你应该改变WHERE条款。您的版本会在2017-08-02的日期/时间恰好是午夜的时候保留航班。使用>=<会更精确 - 在一天内完成所有日期/时间,而不是下一次。