女士们,先生们,
我在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
第三栏显示有多少已售出(和查询)的产品类型至少获得一次折扣。
我尝试过各种动态交叉生成查询(是的,我已经看过它们了),但是我没有足够的心理RAM来一次性包裹所有内容。您如何以最有效的方式处理这个问题?临时表/存储过程等是可以的,非常欢迎粗略的想法。谢谢!
答案 0 :(得分: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)
请注意,第一个查询是第二个查询的子查询。
答案 1 :(得分: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
(如果是大表,请务必测试您的表现。)