長いタイトルと奇妙な問題: 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" を使用できない理由を知りたいと思います。