2016-09-11 14 views
1

У меня есть следующий запрос, который работает отлично. Запрос суммирует значения в данный день.SQL Server SUM (значения)

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». Вот как работает оборудование, которое отправляет мне данные.

Я хотел бы знать, как инкапсулировать> = полуночи до полуночи в запросе.

Dataset:

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 

Спасибо заранее.

Ожидаемое значение выходной суммы для 20/03/2016 составляет: 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 

Столбец значения является суммой значений в этот день, сделали много раз в разное время.

+0

Ваш будет необходимо пройти время через ваш пункт, где – Merenix

+0

Вы можете использовать операторы регистра в вашей GROUP BY, вы знаете. –

+0

Можем ли мы беспокоить вас за дизайн стола?Может быть в состоянии сбить что-то немного cheekier и проще для вас – Merenix

ответ

1

Используйте следующий запрос для подведения значения в полночь с предыдущим днем.

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 

Пример вывода:

enter image description here

+0

Это работает отлично. Именно поэтому я понимаю оператор CASE, я могу изменить суммирование до месяцев и т. Д., Изменив номер преобразования (т.е. 102). –

+0

Отличный .. Дайте голосование, если вы согласны с этим решением ... :) –

1

Во-первых, я понятия не имею, что делает статья 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) 
+0

Я добавил набор данных, чтобы показать, что я имею в виду. Эти данные поступают через полчаса, но могут быть отправлены в минутах в другое время. –

+0

Вы говорите, что вычитание часа не отвечает на ваш вопрос? –

+0

Мне нужно было добавить некоторое время @Unnikrishnan R получил результат, который я искал (выше) –

1

Тот же ответ, что и @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) 
+0

Привет, Это должно быть больше, чем в полночь, и меньше, чем в полночь следующего дня. Данные поступают от регистратора данных, который следит за оборудованием завода, а все разные станции отправляют данные в разное время, иногда его секунды, иногда его минуты и иногда полчаса. Там около 100 раз в настоящее время - да, это кошмар! –

+0

Также добавьте требуемый вывод. – BhatiaAshish

+0

Я добавил ожидаемый результат в исходный комментарий, –

1
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) 
Смежные вопросы