Я пытаюсь написать запрос, который агрегирует данные в таблице в соответствии с предоставленной пользователем таблицей, которая управляет агрегацией. Я работал нормально, когда просто использовал оператор суммирования, но когда я помещал сумму в оператор регистра, чтобы пользователь мог указать сумму, число, среднее и т. Д., Я получаю группу по ошибкам.
Я заменил:
sum(column)
с:
CASE b.calculationtype
WHEN 'SUM' THEN SUM(column)
WHEN 'MEAN' THEN AVG(column)
WHEN 'COUNT' THEN COUNT(column)
WHEN 'VARIANCE' THEN VARIANCE(column)
WHEN 'STANDARD DEVIATION' THEN STDDEV(column)
END
Видит ли Oracle за пределами оператора case при оценке группы по функции или мне не повезло, пытаясь изменить фактическую функцию агрегирования на основе значения в таблице b?
Я всегда мог сделать это грубо и перенести логику типа расчета за пределы фактического запроса, но это кажется немного болезненным, поскольку у меня было бы 5 одинаковых запросов с различными агрегатными функциями, которые вызывались в зависимости от типа вычисления поле.
select b.REPORT,
case b.AGG_VARIABLE_A_FLAG
when 'N' then null
when 'Y' then a.AGG_VARIABLE_A
end,
case b.AGG_VARIABLE_B_FLAG
when 'N' then null
when 'Y' then a.AGG_VARIABLE_B
end,
--<<< problem starts >>>
case b.CALCULATIONTYPE
when 'SUM' then sum(a.column1) when 'MEAN' then avg(a.column1) when 'COUNT' then count(a.column1) when 'VARIANCE' then variance(a.column1) when 'STANDARD DEVIATION' then stddev(a.column1)
end,
case b.CALCULATIONTYPE
when 'SUM' then sum(a.column2) when 'MEAN' then avg(a.column2) when 'COUNT' then count(a.column2) when 'VARIANCE' then variance(a.column2) when 'STANDARD DEVIATION' then stddev(a.column2)
end
--<<< problem ends >>
from DATA_TABLE a
cross join CONTROL_TABLE b
where a.ID = bind_variable_id
and a.SOURCEARRAY = b.SOURCEARRAY
and b.CALCULATIONTYPE <> 'INTERNAL'
group by b.REPORT,
case b.AGG_VARIABLE_A_FLAG
when 'N' then null
when 'Y' then a.AGG_VARIABLE_A
end,
case b.AGG_VARIABLE_B_FLAG
when 'N' then null
when 'Y' then a.AGG_VARIABLE_B
end