我使用的mysql服务器示例有一定的限制(没有cte,不能创建临时表,甚至不能创建新表),所以唯一可以解决的方法就是使用派生表。
我有下表 t
,包含每个月(1-12)的每次销售事件:
+------+-----------+-----------------+
| id | product | sold_on_month |
+------+-----------+-----------------+
| 1 | Product 1 | 1 |
| 2 | Product 1 | 2 |
| 3 | Product 1 | 2 |
| 4 | Product 1 | 3 |
| 5 | Product 1 | 3 |
| 6 | Product 1 | 4 |
| 7 | Product 1 | 4 |
| 8 | Product 1 | 4 |
| 9 | Product 1 | 4 |
| 10 | Product 1 | 4 |
| 11 | Product 2 | 1 |
| 12 | Product 2 | 1 |
| 13 | Product 2 | 2 |
| 14 | Product 2 | 2 |
| 15 | Product 2 | 3 |
| 16 | Product 2 | 3 |
+------+-----------+-----------------+
我想创建一个查询,回答我按产品和月份销售了多少产品,如下所示:
+-----------+---------+------------+
| product | month | how_many |
+-----------+---------+------------+
| Product 1 | 1 | 1 |
| Product 1 | 2 | 2 |
| Product 1 | 3 | 2 |
| Product 1 | 4 | 5 |
| Product 1 | 5 | 0 |
| Product 1 | 6 | 0 |
| Product 1 | 7 | 0 |
| Product 1 | 8 | 0 |
| Product 1 | 9 | 0 |
| Product 1 | 10 | 0 |
| Product 1 | 11 | 0 |
| Product 1 | 12 | 0 |
| Product 2 | 1 | 2 |
| Product 2 | 2 | 2 |
| Product 2 | 3 | 2 |
| Product 2 | 4 | 0 |
| Product 2 | 5 | 0 |
| Product 2 | 6 | 0 |
| Product 2 | 7 | 0 |
| Product 2 | 8 | 0 |
| Product 2 | 9 | 0 |
| Product 2 | 10 | 0 |
| Product 2 | 11 | 0 |
| Product 2 | 12 | 0 |
+-----------+---------+------------+
到目前为止,我取得的成就是:如果我有一个没有列的类似表 product
如果我想按月份分组,问题是:
SELECT
a.mn, COUNT(t.sold_on_month)
FROM
(SELECT 1 AS mn UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) AS a
LEFT JOIN t
ON t.sold_on_month = a.mn
GROUP BY a.mn;
所以,我真正需要的是一个查询,它使用相同的派生表来计算月份,并按产品和销售月份分组,显示 0
在 how_many
当当月没有销售产品时。记住我不能使用cte或临时表。
感谢您的帮助!:)
1条答案
按热度按时间bxpogfeg1#
使用查询生成不同的产品列表(如果您有一个products表,您可以引用它。)
只要给出问题中的表,我们就可以得到这样一个不同的列表
我们可以把它 Package 成一个内联视图(mysql术语中是一个派生表),然后交叉连接到生成的月份列表,
然后我们可以加入到
t
,并在选择列表中进行分组和聚合。。。如果内联视图有其他源
p
,而不是问题中的表(例如,具有不同产品列表的产品表),我们可以引用该表。诀窍在于
CROSS JOIN
在“月”和“产品”之间。然后使用外部联接从中获取匹配行
t
.