sql - 选择按 id 分组的日期段的列的总和

标签 sql date select group-by sum

我需要按 11:00 到第二天 10:00 的时间段选择值的总和,并按 ID 分组。

这是我的表 1:

          date          value    id
"2017-03-29 11:00:00"   "453"   "id1"   
"2017-03-29 12:00:00"   "000"   "id1"   
"2017-03-29 13:00:00"   "234"   "id1"   
"2017-03-29 14:00:00"   "000"   "id1"   
"2017-03-29 15:00:00"   "000"   "id1"   
"2017-03-29 16:00:00"   "222"   "id1"   
"2017-03-29 17:00:00"   "000"   "id1"   
"2017-03-29 18:00:00"   "000"   "id1"   
"2017-03-29 19:00:00"   "000"   "id1"   
"2017-03-29 20:00:00"   "000"   "id1"   
"2017-03-29 21:00:00"   "000"   "id1"   
"2017-03-29 22:00:00"   "000"   "id1"   
"2017-03-29 23:00:00"   "123"   "id1"   
"2017-03-30 00:00:00"   "000"   "id1"   
"2017-03-30 01:00:00"   "000"   "id1"   
"2017-03-30 02:00:00"   "000"   "id1"   
"2017-03-30 03:00:00"   "000"   "id1"   
"2017-03-30 04:00:00"   "000"   "id1"   
"2017-03-30 05:00:00"   "000"   "id1"   
"2017-03-30 07:00:00"   "000"   "id1"   
"2017-03-30 08:00:00"   "000"   "id1"   
"2017-03-30 09:00:00"   "000"   "id1"   
"2017-03-30 10:00:00"   "333"   "id1"   
"2017-03-30 11:00:00"   "000"   "id1"   
"2017-03-30 12:00:00"   "123"   "id1"   
"2017-03-30 13:00:00"   "000"   "id1"   
"2017-03-30 14:00:00"   "000"   "id1"   
"2017-03-30 15:00:00"   "000"   "id1"   
"2017-03-30 16:00:00"   "000"   "id1"   
"2017-03-30 18:00:00"   "000"   "id1"   
"2017-03-30 19:00:00"   "000"   "id1"   
"2017-03-30 20:00:00"   "000"   "id1"   
"2017-03-30 21:00:00"   "000"   "id1"   
"2017-03-30 22:00:00"   "000"   "id1"   
"2017-03-30 23:00:00"   "000"   "id1"   
"2017-03-31 00:00:00"   "000"   "id1"   
"2017-03-31 01:00:00"   "000"   "id1"   
"2017-03-31 02:00:00"   "000"   "id1"   
"2017-03-31 03:00:00"   "000"   "id1"   
"2017-03-31 04:00:00"   "000"   "id1"   
"2017-03-31 05:00:00"   "000"   "id1"   
"2017-03-31 06:00:00"   "000"   "id1"   
"2017-03-31 07:00:00"   "000"   "id1"   
"2017-03-31 08:00:00"   "000"   "id1"   
"2017-03-31 09:00:00"   "000"   "id1"   
"2017-03-29 12:00:00"   "756"   "id2"   
"2017-03-29 13:00:00"   "701"   "id2"   
"2017-03-29 14:00:00"   "758"   "id2"   
"2017-03-29 15:00:00"   "867"   "id2"   
"2017-03-29 16:00:00"   "924"   "id2"   
"2017-03-29 17:00:00"   "871"   "id2"   
"2017-03-29 18:00:00"   "817"   "id2"   
"2017-03-29 19:00:00"   "109"   "id2"   
"2017-03-29 20:00:00"   "131"   "id2"   
"2017-03-29 21:00:00"   "126"   "id2"   
"2017-03-29 22:00:00"   "120"   "id2"   
"2017-03-29 23:00:00"   "120"   "id2"   
"2017-03-30 00:00:00"   "930"   "id2"   
"2017-03-30 01:00:00"   "108"   "id2"   
"2017-03-30 09:00:00"   "867"   "id2"   
"2017-03-30 10:00:00"   "808"   "id2"   
"2017-03-30 11:00:00"   "756"   "id2"   
"2017-03-30 12:00:00"   "758"   "id2"   
"2017-03-30 13:00:00"   "866"   "id2"   
"2017-03-30 14:00:00"   "981"   "id2"   
"2017-03-30 15:00:00"   "981"   "id2"   
"2017-03-30 16:00:00"   "872"   "id2"   
"2017-03-30 17:00:00"   "928"   "id2"   
"2017-03-30 18:00:00"   "109"   "id2"   
"2017-03-30 19:00:00"   "115"   "id2"   
"2017-03-30 20:00:00"   "121"   "id2"   
"2017-03-30 21:00:00"   "131"   "id2"   
"2017-03-30 22:00:00"   "148"   "id2"   
"2017-03-30 23:00:00"   "132"   "id2"   
"2017-03-31 00:00:00"   "115"   "id2"   
"2017-03-31 01:00:00"   "120"   "id2"   
"2017-03-31 02:00:00"   "137"   "id2"   
"2017-03-31 03:00:00"   "137"   "id2"   
"2017-03-31 04:00:00"   "132"   "id2"   
"2017-03-31 05:00:00"   "126"   "id2"   
"2017-03-31 06:00:00"   "126"   "id2"   
"2017-03-31 07:00:00"   "104"   "id2"   
"2017-03-31 08:00:00"   "874"   "id2"   
"2017-03-31 09:00:00"   "651"   "id2"   
"2017-03-31 10:00:00"   "540"   "id2"   

结果表应该是这样的:

date_period                                  value_sum   id
"2017-03-29 11:00:00 - 2017-03-30 10:00:00"    1365     "id1"
"2017-03-30 11:00:00 - 2017-03-31 10:00:00"    123      "id1"
"2017-03-29 11:00:00 - 2017-03-30 10:00:00"    9013     "id2"
"2017-03-30 11:00:00 - 2017-03-31 10:00:00"    9834     "id2"

Table1只是一个例子,真实的表有很多2015年到2017年的id和大日期,而不仅仅是2017-03-29到2017-03-31。我需要按 11:00 到第二天 10:00 的时间段选择所有值的总和,并按 id 分组。

Oracle 和 MSSQL 中应该有 2 个解决方案。

最佳答案

我认为以下查询将帮助您解决问题,如果您有任何其他问题,请告诉我

DECLARE @ProductTotals TABLE
    (
        Daytime Datetime, 
      ProductID int, 
      id nvarchar(50)
    )
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 11:00:00',453,'id1')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-04-30 12:00:00',568,'id1')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-05-31 13:00:00',500,'id1')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 11:00:00',586,'id2')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 12:00:00',895,'id2')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 13:00:00',452,'id2')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 11:00:00',875,'id3')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 12:00:00',586,'id3')
    INSERT INTO @ProductTotals (Daytime,ProductID, id) values('2017-03-29 13:00:00',784,'id3')


SELECT sum(t.sumid) AS sumid,
       T.id,
       T.Duration from(
SELECT p.ProductID AS sumid,
       p.id,
       Duration = cast(DATEADD(DAY, DATEDIFF(DAY, 0, Daytime), '10:00:00') AS varchar)+' - ' + cast(DATEADD(DAY, DATEDIFF(DAY, -1, Daytime), '11:00:00') AS varchar)
FROM @ProductTotals p
GROUP BY p.id,
         p.Daytime,
         p.ProductID
HAVING Daytime > DATEADD(DAY, DATEDIFF(DAY, 0, Daytime), '10:00:00')
AND Daytime < DATEADD(DAY, DATEDIFF(DAY, -1, Daytime), '11:00:00')

    )T 
group by T.id,t.Duration

OutPut is Given below 

568     id1 Apr 30 2017 10:00AM - May  1 2017 11:00AM
453     id1 Mar 29 2017 10:00AM - Mar 30 2017 11:00AM
1933    id2 Mar 29 2017 10:00AM - Mar 30 2017 11:00AM
2245    id3 Mar 29 2017 10:00AM - Mar 30 2017 11:00AM
500     id1 May 31 2017 10:00AM - Jun  1 2017 11:00AM

关于sql - 选择按 id 分组的日期段的列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44280362/

相关文章:

c# - 在 ASP.NET Web 窗体网站上存储和显示图像

linux - 如何从时间戳而不是当前时间中减去 10 分钟

java - 确定 Java 中时区的 DST 切换日期(向前和向后)?

mysql - 将 2 个查询合二为一

SQL Server 索引 - LIKE 查询的任何改进?

sql - Firebird 查询 - 包含下一行的值

带有外键列表的 SQLite 字段

sql - 如何随机分配结果集的一部分顺序?

mysql - mysql 上的触发更新第二次运行

mysql - 如何获取一组按字段排序的数据,但空值应该稍后出现并按不同的条件排序?