Oracle SQL 分组查询中的条件聚合函数
Oracle SQL Conditional aggregate function in group by query
我正在尝试编写一个查询,该查询将根据驱动聚合的用户提供的 table 聚合 table 中的数据。当我只使用 sum 语句时,我让它工作得很好,但是当我将 sum 放在 case 语句中以允许用户指定 sum、count、mean 等时,我得到了 group by 错误。
我替换了:
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 语句之外的内容,还是我运气不好,试图根据 table 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
在 GROUP BY
子句中添加 b.calculationtype
。
我正在尝试编写一个查询,该查询将根据驱动聚合的用户提供的 table 聚合 table 中的数据。当我只使用 sum 语句时,我让它工作得很好,但是当我将 sum 放在 case 语句中以允许用户指定 sum、count、mean 等时,我得到了 group by 错误。
我替换了:
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 语句之外的内容,还是我运气不好,试图根据 table 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
在 GROUP BY
子句中添加 b.calculationtype
。