长标题和奇怪的问题:我想在 oracle SQL 中使用 with 语句在 select as group by 子句中重用子查询。此外,我使用 case 语句来创建更多信息并对结果进行分组。但是,此语句会引发以下错误:ORA-00979:不是 GROUP BY 表达式。
不起作用的示例查询:我定义了一个查询,其中包含每个产品系列的销售额总和。我对这个查询进行排序,然后选择最畅销的产品系列。作为主要结果,我想将这个最畅销的系列与其他产品系列的销售额总和进行比较(不是一个一个,而是所有其他产品系列组合在一起)。我这样做的方式如下:
WITH
top_family AS (
SELECT *
FROM (SELECT c.family
FROM products c, sales d
WHERE c.product_id= d.product_id
GROUP BY c.family
ORDER BY SUM(d.quantity) DESC)
WHERE ROWNUM = 1)
SELECT CASE
WHEN a.family IN (SELECT * FROM top_family)
THEN 'Most sold category'
ELSE 'Other categories'
END Family, SUM(a.price*b.quantity) "Total monetary sales"
FROM products a, sales b
WHERE a.product_id = b.product_id
GROUP BY CASE
WHEN a.family IN (SELECT * FROM top_family)
THEN 'Most sold category'
ELSE 'Other categories'
END
ORDER BY 1;
一个有趣的事实是,如果我将上面代码中定义的子查询“top_family”直接替换到代码中(所以用 select * from (select ...) 语句替换每个包含 top_family 的地方),它可以工作并且给出了想要的结果。
该问题可能是由使用 with 语句中定义的子查询引起的。虽然我意识到有比这个更好和更优雅的解决方案,但我想找出为什么我不能在 group by 和 select 语句中使用表别名“top_family”。