web-dev-qa-db-ja.com

サブクエリでのSQLGROUP BY

UNION ALLを使用して2つのテーブルから1つに結果を返すクエリがあります。これは、必要に応じてすべて機能します。ただし、返されたデータセットに対してGROUPBYとORDERBYを実行する必要がありますが、多くのエラーが発生し、それを解決する方法がわかりません。

これが私のクエリです:

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

これにより、次のような結果セットが返されます。

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

次に、ProductIDフィールドでGROUP BYを実行し、最後にQuantityフィールドでORDER BY DESCを実行します。したがって、最終出力では、この特定の結果セットは最終的に次のようになります。

ProductID
8
15
20
5

その後、通常どおり、この結果セットに対してクエリを実行できます。

編集:

上で述べたように、しかし十分に暗示されていないのは、返された結果に対してクエリを実行する必要があるということです。これは、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
) 

ただし、次のエラーが発生します。TOP、OFFSET、またはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および一般的なテーブル式ではORDERBY句が無効です。

製品の出力は、サブクエリで返される順序である必要があります(数量別)

7
JakeJ
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
13
podiluska

これは機能しますか?

SELECT ProductID
    from
    (
        SELECT ProductID, Quantity  
        FROM BasketItems  
        UNION ALL  
        SELECT ProductID, Quantity  
        FROM OrderItems 
    ) temp
    GROUP BY temp.ProductID
    ORDER BY SUM(temp.Quantity) desc
1
NG.

これがcteバージョンです(ライブテストはありませんので、失敗を許してください)

[〜#〜]編集[〜#〜]

;WITH myInitialdata_cte(ProductID,Quantity)
AS
    (
    SELECT ProductID, Quantity FROM BasketItems
    UNION ALL  
    SELECT ProductID, Quantity  FROM OrderItems 
    )
SELECT b.ID
FROM 
     myInitialdata_cte a
     INNER JOIN Products b ON
         a.ProductID = b.ID
GROUP BY ProductID
ORDER BY SUM(a.Quantity) DESC
0
whytheq