0

正規化されていない顧客注文のテーブルがあります。販売された製品の数を数え、タイプごとに表に表示したいと思います。

OnlineSalesKey  SalesOrderNumber  ProductKey
--------------------------------------------
     1              20121018         778
     2              20121018         774
     3              20121018         665
     4              20121019         772
     5              20121019         778
     9              20121019         434
    10              20121019         956
    11              20121020         772
    12              20121020         965
    15              20121020         665
    16              20121020         778
    17              20121021         665

私の質問:

SELECT 
    s.ProductKey, COUNT (*) As Purchased 
FROM
    Sales s
GROUP BY 
    s.ProductKey

質問1。

そのクエリは仕事をします。しかし、今は表示して、複数のアイテムを購入した注文のみを考慮に入れたいと思います。1つのクエリでそれを行う方法がわかりません。何か案は?

質問2

結果を正規化し、半列で区切られたデータを取得することは可能ですか?

20121018 | 778; 774; 665

ありがとう!

4

4 に答える 4

4

使用しているSQLデータベースはわかりません。データベースごとに、多かれ少なかれ効率的な答えが異なります。(申し訳ありませんが、MSSQLが質問のタイトルに含まれていることに気づきました。)

すべてまたはほとんどのデータベースで機能するソリューションは次のとおりです。

SELECT s.ProductKey, COUNT (*) As Purchased 
FROM Sales s
WHERE SalesOrderNum IN 
 (SELECT SalesOrderNum FROM Sales GROUP BY SalesOrderNum HAVING COUNT(*) > 1)
GROUP BY s.ProductKey

これは最も効率的ではありませんが、ほとんどの製品で機能するはずです。

また、正規化された用語と正規化されていない用語を逆に使用していることに注意してください。あなたが持っているテーブルは正規化され、あなたが望む結果は非正規化されます。

SQLのみを使用して必要な非正規化結果を取得するための標準のSQLステートメントはありませんが、一部のデータベース(MySQLおよびSQLite)は、これを行うためのgroup_concat関数を提供します。

于 2012-10-18T19:13:36.107 に答える
2

Q1:HAVING句を見てください

それらの注文のみを表示して考慮に入れます...

SELECT s.SalesOrderNumber, COUNT (*) As Purchased 
FROM Sales s
GROUP BY s.SalesOrderNumber
HAVING COUNT(*) > 1

したがって、注文ごとにグループ化し、HAVINGで条件を適用してから、SELECT句にSalesOrderNumberを表示します。

Q2:いくつかのグループ連結手法を見てください。

MySQL:

SELECT s.SalesOrderNumber, GROUP_CONCAT(DISTINCT ProductKey
                                      ORDER BY ProductKey SEPARATOR '; ')
FROM Sales s
GROUP BY s.SalesOrderNumber

SQL Server:重複する質問に対するこの回答を参照してください。基本的に、FORXMLを使用します。

于 2012-10-18T19:13:54.543 に答える
1
SELECT s.ProductKey, COUNT (*) As Purchased 
FROM
Sales s
GROUP BY s.ProductKey
having count(*) > 1

編集 -

回答1-注文で複数の商品を購入した商品を表示するには-

SELECT s.ProductKey, COUNT (*) As Purchased 
FROM Sales s
WHERE SalesOrderNum in
(
select SalesOrderNum from Sales 
group by SalesOrderNum having count(*) > 1
)
GROUP BY s.ProductKey
于 2012-10-18T19:12:14.980 に答える
1

1)これを試してください:

SELECT s.ProductKey, COUNT (*) As Purchased 
FROM
Sales s
GROUP BY s.ProductKey
HAVING COUNT(*) > 1
于 2012-10-18T19:13:26.390 に答える