Нужен пользовательский запрос в 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 
Другие вопросы по тегам