我在IBM DB2上有一个简单的SQL查询。我正在尝试运行如下内容:
select case when a.custID = 42285 then 'Credit' when a.unitID <> '' then 'Sales' when a.unitID = '' then 'Refund'
else a.unitID end TYPE, sum(a.value) as Total from transactions a
group by a.custID, a.unitID
此查询运行,但是我对group by a.custID
有问题 - 我宁愿不要这样做,但除非存在,否则查询不会运行。我想根据CASE
函数的结果运行group by
函数,而不是它后面的条件池。所以,我看起来像这样:
group by TYPE
但是,添加group by TYPE
会报告错误消息"Column or global variable TYPE not found"
。此外,从组部分报告中删除a.custID
"Column custID or expression in SELECT list not valid"
这是否完全可能,或者我是否需要查看我的CASE
函数并避免使用custID
列,因为目前我也基于custID
列进行分组,即使它不存在SELECT
。
我理解为什么分组会这样工作,我只是想知道是否有可能摆脱custID
分组,但仍将其保留在CASE
函数中。
如果你想要简洁的代码,你可以在这里使用一个子查询:
SELECT TYPE, SUM(value) AS Total
FROM
(
SELECT CASE WHEN a.custID = 42285 THEN 'Credit'
WHEN a.unitID <> '' THEN 'Sales'
WHEN a.unitID = '' THEN 'Refund'
ELSE a.unitID END TYPE,
value
FROM transactions a
) t
GROUP BY TYPE;
另一种方法是在GROUP BY
子句中重复CASE
表达式,这很丑陋,但应该仍然有效。 请注意,某些数据库(例如MySQL(具有重载GROUP BY
并且至少在某些情况下允许使用别名。