0

ここ数日間、私は毎日のカウントと呼んでいるものを含むテーブルから非常に重要な情報セットを引き出す方法を見つけようと試みてきました. 次のように設定されたテーブルがあります。

person|company|prod1|prod2|prod3|gen_date

各企業には複数の担当者がおり、各担当者は購入した製品のさまざまな組み合わせを持つことができます。私が理解しようとしているのは、企業ごとに特定の製品を購入した人の数をリストする SQL ステートメントです。したがって、次のような出力が得られます。

Comp ABC | 13 Prod1 |  3 Prod2 | 5 Prod 3
Comp DEF |  2 Prod1 | 15 Prod2 | 0 Prod 3
Comp HIJ |  0 Prod1 |  0 Prod2 | 7 Prod 3 

現在、人が製品を選択しなかった場合、保存される値は ですNULL

私が今持っている最高のものは、単独で実行した場合にこの情報を生成できる 3 つの異なるステートメントです。

SELECT Count(person) as puchases, company 
FROM Sales  WHERE prod1 = '1' and gendate = '3/24/2010' 
Group BY company
4

2 に答える 2

3
SELECT      company,
            SUM(COALESCE(prod1, 0)) AS total_prod1,
            SUM(COALESCE(prod2, 0)) AS total_prod2,
            SUM(COALESCE(prod3, 0)) AS total_prod3
FROM        Sales  
WHERE       gendate = '2010-03-24' 
GROUP BY    company

ただし、テーブルを正規化する必要があります-4つに分割します。

  • 会社、
  • 人、
  • 製品、
  • Person_Product_Purchase (購入日)。
于 2010-03-24T20:48:25.720 に答える
0

値が製品フィールドのいずれかにあるかどうかを確認したいだけの場合は、OR演算子を使用して簡単に実行できます。

SELECT company, COUNT(person) as purchases
FROM Sales
WHERE (prod1 = '1' OR prod2 = '1' OR prod3 = '1')
AND gendate = '3/24/2010'
GROUP BY company

ただし、これはあまりうまく機能しません。スキーマが適切に正規化されていないため、うまく機能させるのに苦労するでしょう。可能であれば、次のように修正する必要があります。

Person (PersonID, CompanyID)
Sales (PurchaseID, PersonID, ProductID, GenDate)

次に、このクエリ (および他の多くのクエリ) を書くのがずっと簡単になります。

SELECT p.CompanyID, COUNT(*) AS purchases
FROM Person p
INNER JOIN Sales s
    ON s.PersonID = p.PersonID
WHERE s.ProductID = 1
AND s.GenDate = '20100324'
GROUP BY p.CompanyID
于 2010-03-24T20:47:25.570 に答える