2

长标题和奇怪的问题:我想在 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”。

4

2 回答 2

1

问题出在GROUP BY CASE WHEN声明中。

该语句仅在执行的最后一步编译。这样子条款就从SELECT CASE WHEN. 此空操作返回错误。

SQL 手册中也对此进行了描述。

于 2013-10-25T07:07:31.207 回答
0

正确阅读您的要求后,我建议您使用以下内容:

WITH
top_product AS (
  SELECT s1.product_id
    FROM sales s1
GROUP BY s1.product_id
  HAVING sum(s1.quantity)
          = (SELECT total_sale
               FROM (SELECT SUM(s.quantity) AS total_sale
                       FROM sales s
                   GROUP BY s.product_id
                   GROUP BY SUM(s.quantity))
              WHERE rownum = 1))

  SELECT CASE t.product_id
            WHEN null THEN 'Other categories'
            ELSE 'Most sold category'
         END Family,
         SUM(a.price*b.quantity) "Total monetary sales"
    FROM products a JOIN sales b
         ON a.product_id =  b.product_id
         LEFT JOIN top_product t ON a.product_id = t.product_id
GROUP BY CASE t.product_id
            WHEN null THEN 'Other categories'
            ELSE 'Most sold category'
         END
ORDER BY 1;
于 2013-10-24T14:03:54.700 回答