1. ホーム
  2. sql

[解決済み] サブクエリでのSQL GROUP BY

2022-02-11 17:39:10

質問内容

UNION ALLを使用して、2つのテーブルから1つのテーブルに結果を返すクエリーがあります。しかし、返されたデータセットでGROUP BYとORDER BYを実行する必要がありますが、多くのエラーが発生し、解決方法がわかりません。

以下は私のクエリです。

SELECT ProductID, Quantity 
FROM BasketItems 
UNION ALL 
SELECT ProductID, Quantity 
FROM OrderItems

すると、このような結果セットが返されます。

ProductID  Quantity  
15         2
20         2
15         1
8          5
5          1

その後、私は GROUP BY の上に ProductID フィールドを作成し、最後に ORDER BY DESC の上に Quantity フィールドを使用します。ですから、最終的な出力では、この特定の結果セットは最終的にこのような結果になります。

ProductID
8
15
20
5

この結果セットに対して、通常行っているようにクエリを実行することができます。

EDITです。

ORDER BY句を持つ結果に対してクエリを実行することはできないので、うまくいきません(私がエラー一覧で調べた限りでは)。

問題の詳細を知りたい方は、こちらをご覧ください。

この結果セットから、関連する商品テーブルから商品を取得したい。

SELECT * FROM Products WHERE ID IN (
    SELECT ProductID
    FROM
    (
        SELECT ProductID, Quantity  
        FROM BasketItems  
        UNION ALL  
        SELECT ProductID, Quantity  
        FROM OrderItems 
    ) v
    GROUP BY ProductID
    ORDER BY SUM(Quantity) DESC
) 

ところが、こんなエラーが出ます。ORDER BY 節は、TOP、OFFSET、または FOR XML が指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。

商品の出力は、サブクエリで返された順番にする必要があります(数量順)。

解決方法は?

SELECT Products.*
FROM Products
     INNER JOIN 
(
    SELECT ProductID, Sum(Quantity) as QuantitySum
    from
    (
        SELECT ProductID, Quantity  
        FROM BasketItems  
        UNION ALL  
        SELECT ProductID, Quantity  
        FROM OrderItems 
    ) v
    GROUP BY ProductID
) ProductTotals
    ON Products.ID = ProductTotals.ProductID
ORDER BY QuantitySum DESC