簡體   English   中英

SQL Server SUM(值)

[英]SQL Server SUM(Values)

我有以下查詢,效果很好。 查詢將給定日期的值相加。

SELECT 
    SUM(fldValue) AS 'kWh',
    DAY(fldDateTime) AS 'Day',
    MONTH(fldDateTime) AS 'Month',
    YEAR(fldDateTime) AS 'Year'            
FROM 
    [Data.tblData]
WHERE 
    tblData_Id IN (SELECT DISTINCT tblData_Id 
                   FROM [Data.tblData])
GROUP BY    
    YEAR(fldDateTime), MONTH(fldDateTime), DAY(fldDateTime),
    tblData_Id,fldDateTime
ORDER BY 
    YEAR(fldDateTime), MONTH(fldDateTime), DAY(fldDateTime)

我的問題是它從午夜到午夜求和,我需要它在午夜(> =午夜)之后到第二天午夜之前求和。 這樣做的原因是一天中輸入的數據總是在午夜之后。 例如,第一個記錄的數據將為“ 2016-01-01 00:01:00”,最后一個記錄的數據將為“ 2016-01-02 00:00:00”。 這就是向我發送數據的硬件的工作方式。

我想知道如何在查詢中封裝> =午夜到午夜。

資料集:

DateTime    Value
20/03/2016 00:30    69.00
20/03/2016 01:00    69.00
20/03/2016 01:30    69.00
20/03/2016 02:00    69.00
20/03/2016 02:30    69.00
20/03/2016 03:00    69.00
20/03/2016 03:30    11.88
20/03/2016 04:00    0.52
20/03/2016 04:30    1.51
20/03/2016 05:00    2.22
20/03/2016 05:30    2.11
20/03/2016 06:00    0.05
20/03/2016 06:30    6.78
20/03/2016 07:00    14.79
20/03/2016 07:30    1.57
20/03/2016 08:00    1.51
20/03/2016 08:30    4.81
20/03/2016 09:00    0.11
20/03/2016 09:30    8.99
20/03/2016 10:00    10.06
20/03/2016 10:30    15.28
20/03/2016 11:00    3.22
20/03/2016 11:30    1.73
20/03/2016 12:00    19.10
20/03/2016 12:30    2.08
20/03/2016 13:00    2.61
20/03/2016 13:30    0.84
20/03/2016 14:00    8.65
20/03/2016 14:30    2.37
20/03/2016 15:00    16.34
20/03/2016 15:30    12.66
20/03/2016 16:00    2.64
20/03/2016 16:30    0.19
20/03/2016 17:00    3.91
20/03/2016 17:30    2.39
20/03/2016 18:00    0.57
20/03/2016 18:30    1.30
20/03/2016 19:00    5.06
20/03/2016 19:30    17.45
20/03/2016 20:00    13.04
20/03/2016 20:30    5.00
20/03/2016 21:00    7.47
20/03/2016 21:30    5.09
20/03/2016 22:00    0.33
20/03/2016 22:30    5.29
20/03/2016 23:00    15.33
20/03/2016 23:30    5.39
21/03/2016 00:00    6.74

先感謝您。

2016年3月20日的預期總和輸出值為:662.98

輸出表如下所示:

SumValue    Day Month   Year    Meter Id
659.18  20  3   2016    6
251.37  21  3   2016    6
279.03  22  3   2016    6
280.03  23  3   2016    6
284.22  24  3   2016    6
310.12  25  3   2016    6
320.84  26  3   2016    6
269.29  27  3   2016    6
276.11  28  3   2016    6
279.11  29  3   2016    6

值列是當天的值總和,由很多次獨立時間組成。

首先,我不知道WHERE子句在做什么,因此我將其刪除。

其次,不要對列名使用單引號。

第三,您的GROUP BY子句太復雜了。 您只需要在SELECT包括未聚合的列。

最后,關鍵思想是在所有使用值的地方減去一小時。 這是一個簡單的方法:

SELECT SUM(fldValue) AS kWh,
       DAY(newdt) AS [Day],
       MONTH(newdt) AS [Month],
       YEAR(newdt) AS [Year]           
FROM (SELECT d.*, DATEADD(hour, -1, fldDateTime) as newdt
      FROM Data.tblData d
     ) d
GROUP BY YEAR(newdt), MONTH(newdt), DAY(newdt)
ORDER BY YEAR(newdt), MONTH(newdt), DAY(newdt)

答案與@Gordon相同,但您可以減去一分鍾而不是一小時。

SELECT SUM(fldValue) AS kWh,
   DAY(newdt) AS [Day],
   MONTH(newdt) AS [Month],
   YEAR(newdt) AS [Year]           
FROM (SELECT d.*, DATEADD(minute, -1, fldDateTime) as newdt
  FROM Data.tblData d
 ) d
GROUP BY YEAR(newdt), MONTH(newdt), DAY(newdt)
ORDER BY YEAR(newdt), MONTH(newdt), DAY(newdt)
declare @tempTable table ([DateTime] datetime, Value Float)

insert into @tempTable ([DateTime], [Value])
select convert(datetime,'20/03/2016 00:30',103), 69.00 union all
select convert(datetime,'20/03/2016 01:00',103), 69.00 union all
select convert(datetime,'21/03/2016 00:00',103), 6.74

select * from @tempTable

select [sum] = SUM(value), [year] = year(DT), [month] = month(DT), [day] = day(DT)
from (select Value, DT = dateadd(second, -1, [DateTime]) from @tempTable) x
group by year(DT), month(DT), day(DT)

使用以下查詢將前一天的午夜值相加。

SELECT 
    SUM(fldValue) AS 'kWh',
    CASE WHEN CONVERT(VARCHAR(8), fldDateTime, 108)='00:00:00' THEN DAY(fldDateTime)-1 ELSE DAY(fldDateTime) END AS 'Day',
    MONTH(fldDateTime) AS 'Month',
    YEAR(fldDateTime) AS 'Year'            
FROM 
    Data.[tblData]
GROUP BY    
    YEAR(fldDateTime), MONTH(fldDateTime),CASE WHEN CONVERT(VARCHAR(8), fldDateTime, 108)='00:00:00' THEN DAY(fldDateTime)-1 ELSE DAY(fldDateTime) END

ORDER BY 
    YEAR(fldDateTime), MONTH(fldDateTime), CASE WHEN CONVERT(VARCHAR(8), fldDateTime, 108)='00:00:00' THEN DAY(fldDateTime)-1 ELSE DAY(fldDateTime) END

樣本輸出:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM