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句が無効です。
製品の出力は、サブクエリで返される順序である必要があります(数量別)
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
これは機能しますか?
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
これが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