Агрегированная функция с LAST_VALUE с использованием оператора CASE и предложения GROUP BY - PullRequest
0 голосов
/ 11 сентября 2018

Я использую оператор MERGE, в запросе SELECT Я пытаюсь использовать функцию LAST_VALUE внутри оператора CASE с различными типами сводки (например, SUM, AVG и т. Д.) С агрегированными функциями. , Я хочу исключить поля [Value], [Target] и [Budget] из предложения GROUP BY. Я использую синтаксис OVER ORDER BY, но постоянно получаю следующую ошибку:

Сообщение 8120, Уровень 16, Состояние 1, Строка 12
Столбец '@ TempFact_KPI.Value' недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

КОД:

CREATE TYPE [dbo].[TempFact_KPI] AS TABLE(
[PeriodKey] [uniqueidentifier] NULL,
[KPIKey] [uniqueidentifier] NULL,
[SummaryType] [nvarchar](50) NULL,
[PeriodDateTime] [datetime] NULL,
[Value] [real] NULL,
[Target] [real] NULL,
[Budget] [real] NULL
)
GO

Хранимая процедура:

SELECT DISTINCT
    [PeriodKey],
    [KPIKey],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Value])
       WHEN 'Count' THEN COUNT([Value])
       WHEN 'Mean' THEN AVG([Value])
       WHEN 'Maximum' THEN MAX([Value])
       WHEN 'Minimum' THEN MIN([Value])
       WHEN 'Last' THEN LAST_VALUE([Value]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Value]
    END as [Value],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Target])
       WHEN 'Count' THEN COUNT([Target])
       WHEN 'Mean' THEN AVG([Target])
       WHEN 'Maximum' THEN MAX([Target])
       WHEN 'Minimum' THEN MIN([Target])
       WHEN 'Last' THEN LAST_VALUE([Target]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Target]
    END AS [Target],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Budget])
       WHEN 'Count' THEN COUNT([Budget])
       WHEN 'Mean' THEN AVG([Budget])
       WHEN 'Maximum' THEN MAX([Budget])
       WHEN 'Minimum' THEN MIN([Budget])
       WHEN 'Last' THEN LAST_VALUE([Budget]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Budget]
    END AS [Budget] 
FROM 
    @TempFact_KPI
GROUP BY 
    [PeriodKey], [KPIKey], [SummaryType]

Я посмотрел опубликованные предложения Запрос минимального, максимального, среднего и последнего значения в TSQL и Поле исключения SQL из GROUP BY в результатах, но используется в WHERE , но он все еще не дает желаемых результатов

1 Ответ

0 голосов
/ 11 сентября 2018

Вы можете использовать оконные функции:

SELECT DISTINCT
[PeriodKey]
,[KPIKey]
,CASE [SummaryType]
    WHEN 'Sum'     THEN SUM([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Count'   THEN COUNT([Value]) OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Mean'    THEN AVG([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Maximum' THEN MAX([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Minimum' THEN MIN([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Last'    THEN LAST_VALUE([Value]) OVER (PARTITION BY [PeriodKey], [KPIKey], [SummaryType] ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
    ELSE [Value]
END as [Value]
 -- ...
FROM @TempFact_KPI;
...