0

皆様、

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 番目の列は、販売された (および照会された) 製品タイプのうち、少なくとも 1 つの割引が与えられた数を示しています。

私はあらゆる種類の動的なクロス集計を生成するクエリを試しました (はい、すべてを見てきました) が、一度にすべてを頭に入れるのに十分な精神的 RAM がありません。これに最も効率的な方法でどのようにアプローチしますか? 一時テーブル/ストアド プロシージャなどは問題ありません。アイデアの大まかな概要は大歓迎です。ありがとうございました!

4

2 に答える 2

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 番目のクエリのサブクエリであることに注意してください。

于 2011-08-02T17:47:13.363 に答える
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

(大きなテーブルの場合は、必ずパフォーマンスをテストしてください。)

于 2011-08-02T17:54:02.480 に答える