0

したがって、練習サイトには質問があります。

どの製品が最も人気がありますか? (アイテム数)

これは、顧客がいて、顧客が最も人気のある注文商品 (TOP 1 注文商品の全体の注文) を知りたがっていることを意味します。
これを解決する方法がわかりません。
何か助けはありますか?
私がこれまでに試したことは次のとおりです。

SELECT TOP(1) ProductID, ProductName
FROM Products
GROUP BY ProductID, ProductName
ORDER BY COUNT(*) DESC

しかし、それは彼らが求めたものとはかけ離れています。
この例では、カウントが最も少ない上位 1 つの製品を取得するだけですが、この製品を注文した顧客については何の意味もありません。
これは、この特定のアイテムが少量だった可能性があり、他のアイテムよりもまだ低いことを意味しますが、他のアイテムは非常に大量であり、現在はわずかに少なくなっています (ただし、まだ十分に低くはありません)

4

3 に答える 3

0

そのテーブルにデータが存在する場合は、数量を合計するなど、カウントよりも洗練された方法で並べ替える必要がある場合があります (その列が存在する場合)。group byまた、ProductID と ProductName が既に一意の識別子である場合は、 andはまったく必要ないことに注意してくださいsum

SELECT TOP(1) ProductID, ProductName FROM Products GROUP BY ProductID, ProductName ORDER BY SUM(Quantity) DESC

あなたのキーが何であるかはわかりませんが、顧客から注文された回数を実際に数えたいと思われるので、Customers テーブルに参加する必要があるかもしれません。ここでは、注文ごとに 1 つの行があり、ProductID キーを共有するテーブル Orders があると想定しています。また、ProductID は Products 内で一意であると想定しています (これは、最初のクエリに基づいているとは限りません)。

SELECT TOP(1) Products.ProductID, Products.ProductName FROM Products LEFT JOIN Orders ON Orders.ProductID = Products.ProductID GROUP BY Products.ProductID, Products.ProductName ORDER BY COUNT(Orders.OrderID) DESC

これは、使用可能なテーブルとキーによって異なります。

于 2016-04-25T16:23:08.400 に答える
-1

このようなものをワークアウトできます(テーブル名/スキーマは異なる場合があります)

with cte_product
as
(
select ProductID,Rank() over (order by Count(1) desc) as Rank from
Orders O
inner join Product P
on P.ProductID = O.ProductID
group by ProductID
)
select P.productID, P.ProductName from
cte_product ct
inner join product p
on ct.productId = p.ProductID
where ct.Rank = 1

Crux は RANK() を使用して最も人気のある製品を取得します。関連する結合を使用して、必要に応じて列をフェッチすることができます。

于 2016-04-25T16:25:07.370 に答える