2

長いタイトルと奇妙な問題: Oracle SQL の with ステートメントを使用して、select as group by 句でサブクエリを再利用したいと考えています。さらに、より多くの情報を作成して結果をグループ化するために、case ステートメントを使用します。ただし、このステートメントは次のエラーをスローします: ORA-00979: GROUP BY 式ではありません。

機能しないクエリの例: 製品ファミリごとの売上の合計を含むクエリを定義します。このクエリを並べ替えて、ベストセラーの製品ファミリを選択します。主な結果として、この最も売れているファミリを他の製品ファミリ (1 つずつではなく、グループ化された他のすべての製品ファミリ) の売上の合計と比較したいと思います。私はこれを次のように行います:

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' をコードに直接置き換えると (つまり、top_family を含むすべての場所を select * from (select ...) ステートメントに置き換える)、それが機能し、望ましい結果が得られます。

この問題は、with ステートメントで定義されたサブクエリを使用することによって引き起こされる可能性があります。これよりも (より優れた、よりエレガントな) 解決策があることは認識していますが、group by および select ステートメントでテーブル エイリアス "top_family" を使用できない理由を知りたいと思います。

4

2 に答える 2

1

問題はGROUP BY CASE WHEN声明にあります。

このステートメントは、実行の最終ステップでのみコンパイルされます。このようにして、その副次条項は から差し控えられますSELECT CASE WHEN。この null 操作はエラーを返しています。

SQL マニュアルにも記載されています。

于 2013-10-25T07:07:31.207 に答える