Нужен пользовательский запрос в SQL Server
У меня есть данные в таблице
Я хочу потребление за последний месяц и потребление за последние три месяца
например на основе чтения
Я попробовал это:
SELECT tbl.CustomerID
,tbl.CustomerName
,tbl2.Last3Months
,tbl.LastMonth
FROM (
SELECT events.event_item_id CustomerID
,items.item_name CustomerName
,MAX(events.event_additional_info) maxR
,MIN(events.event_additional_info) minR
,(MAX(events.event_additional_info) - MIN(events.event_additional_info)) AS LastMonth
FROM events
INNER JOIN items ON events.event_item_id = items.item_id
WHERE (events.event_additional_info <> '0.000000')
AND (
events.event_timestamp BETWEEN '08-MAY-15 12:00:00 AM'
AND '08-Jun-15 6:21:59 PM'
)
GROUP BY events.event_item_id
,items.item_name
) tbl
,(
SELECT events.event_item_id CustomerID
,items.item_name CustomerName
,MAX(events.event_additional_info) maxR
,MIN(events.event_additional_info) minR
,(MAX(events.event_additional_info) - MIN(events.event_additional_info)) AS Last3Months
FROM events
INNER JOIN items ON events.event_item_id = items.item_id
WHERE (events.event_additional_info <> '0.000000')
AND (
events.event_timestamp BETWEEN '08-MAR-15 12:00:00 AM'
AND '08-Jun-15 6:21:59 PM'
)
GROUP BY events.event_item_id
,items.item_name
) tbl2
WHERE tbl2.CustomerID = tbl.CustomerID
1 ответ
Решение
Вы не предоставили схему, поэтому я работал с этим:
DECLARE @MeterReading TABLE( ID INT, ReadingDate DateTime, Reading MONEY)
SQL DateDiff
функция является ключом. Учитывая ввод даты "как" (которая может быть по умолчанию через GETDATE()
Вы можете получить показания в течение последнего месяца (DATEDIFF = 0) и в течение месяцев 0, 1 и 2 (следовательно, 3 месяца).
Первый запрос (в предложении WITH) ограничивает данные 3 месяцами и находит максимум / мин для каждого месяца.
Тогда последний запрос довольно прост
DECLARE @ASOF DateTime = GETDATE(); -- semicolon is important here!
WITH monthreadinds as (SELECT id
, DATEDIFF(MONTH,mr.ReadingDate , @ASOF) as WhichMonthAgo
, MIN(reading) as MinReading
, max(reading) as MaxReading
FROM @MeterReading mr
WHERE DATEDIFF(MONTH,mr.ReadingDate , @ASOF) <= 2 -- very important (limits to 3 months)
group by ID, DATEDIFF(MONTH,mr.ReadingDate , @ASOF)
)
SELECT id,
SUM( CASE WHEN mr.WhichMonthAgo = 0 THEN mr.MaxReading - mr.MinReading ELSE 0 END ) as LastMonthConsumption,
MAX(mr.MaxReading) - MIN(mr.MinReading) as Last2MonthsConsumption
FROM monthreadinds mr
GROUP by id