2011-08-02 14 views
0

皆様、2列にわたるMySQL動的クロス集

私はMySQL 5.1で次の問題があります。ここに私のテーブルがあります。

Sale | Store | Product | Discount 
--------------------------------- 
1 | 1 | B  | Yes 
2 | 1 | B  | Yes 
3 | 1 | B  | No 
4 | 1 | D  | Yes 
5 | 1 | A  | No 
6 | 2 | A  | No 
7 | 3 | B  | No 
8 | 3 | B  | No 
9 | 1 | D  | Yes 
10 | 2 | A  | No 

は今、これは当然のことながら、データを整理するひどく不便な方法ですが、それはデータが入ってくるために起こったのかだ(とでてくるしていきます)。

商品タイプの完全な任意のリストを捨てることができる必要があります(カンマ区切り)。 A,B,Cとしましょう結局、私は店が何を売ったのかのリストが必要です。理解しやすくする中間結果があります。

Store | Product | Sales | Discounts 
----------------------------------- 
    1 | A  | 1 | 0 
    1 | B  | 3 | 2 
    1 | C  | 0 | 0 
    2 | A  | 2 | 0 
    2 | B  | 0 | 0 
    2 | C  | 0 | 0 
    3 | A  | 0 | 0 
    3 | B  | 2 | 0 
    3 | C  | 0 | 0 

は私が必要なもの、最終的には、これです:

Store | Product types sold | Discounts given on product types: 
------------------------------------------------------------- 
    1 |   2   |  1 
    2 |   1   |  0 
    3 |   1   |  0 

3列目は、少なくとも一つの割引を与えたか販売(および照会)品種の多く言います。

すべての種類のダイナミックなクロス集計生成クエリを試しましたが(はい、私はそれらをすべて見てきました)、私はすべてのことを頭の中で包み込むための十分な精神RAMを持っていません。どのようにこれを最も効率的な方法にアプローチしますか?テンポラリテーブル/ストアドプロシージャなどは大丈夫ですが、アイデアの概要は大歓迎です。ありがとうございました!

答えて

3

あなたはグループ店舗や商品によってあなたのデータはあなたの中間結果を生成することができます。そして、

mysql> SELECT Store, Product, 
COUNT(1) AS Sales, 
SUM(IF(Discount='Yes', 1, 0)) AS Discounts 
FROM input 
WHERE Product IN ('A', 'B', 'C', 'D') 
GROUP BY Store, Product 
+-------+---------+-------+-----------+ 
| Store | Product | Sales | Discounts | 
+-------+---------+-------+-----------+ 
|  1 | A  |  1 |   0 | 
|  1 | B  |  3 |   2 | 
|  1 | D  |  2 |   2 | 
|  2 | A  |  2 |   0 | 
|  3 | B  |  2 |   0 | 
+-------+---------+-------+-----------+ 
5 rows in set (0.00 sec) 

をすることができますちょうど店によってこの結果は、最終的な結果に変換するグループ:

mysql> SELECT Store, 
COUNT(1) AS `Product types sold`, 
SUM(Discounts) AS `Discounts given on product types` 
FROM (
SELECT Store, Product, 
COUNT(1) AS Sales, 
SUM(IF(Discount='Yes', 1, 0)) AS Discounts 
FROM input 
WHERE Product IN ('A', 'B', 'C', 'D') 
GROUP BY Store, Product 
) AS intermediate 
GROUP BY Store 
+-------+--------------------+----------------------------------+ 
| Store | Product types sold | Discounts given on product types | 
+-------+--------------------+----------------------------------+ 
|  1 |     3 |        4 | 
|  2 |     1 |        0 | 
|  3 |     1 |        0 | 
+-------+--------------------+----------------------------------+ 
3 rows in set (0.00 sec) 

最初のクエリは2番目のクエリのサブクエリです。私はちょうどクエリを分離していると思う

+0

この時点で、それはすべての割引ではなく、「製品をカウント(3種類の商品のみで4割引を返します) – Inca

+0

うん。私はデータを処理する方法を見つけたかもしれませんが、これは堅実なアプローチです。しかし、たとえ売り上げがゼロの商品であっても、すべての店舗と商品タイプが中間結果に表示されたかったらどうでしょうか? –

1

が最も簡単です:

select Store, 
    (Select count(distinct Product) from products as p2 where p2.Store = p1.Store), 
    (Select count(distinct Product) from products as p3 where p3.Store = p1.Store and p3.Discount = "Yes") 
from products p1 
group by Store 

(。それは大規模なテーブルについてであれば、あなたのパフォーマンスをテストしてください)

+0

私は実際に私が列リストで選択を行うことができるか分からなかった。他に何もなければ、私はそこで何かを学んだ:Dありがとう! –

関連する問題