我想展示来自MySQL数据库(实际上是MariaDB)的信息,大致如下所示:
SELECT Client, Year, SUM(Sales)
FROM MySalesTable
GROUP BY Client, Year
ORDER BY Client, Year DESC
问题是,如果客户端没有特定年份的数据,MySQL会完全跳过这些行,而我希望表包含某个范围内的所有年份(例如:2015-2022)-用零、空值或空字符串填充。
通常,我会用left-JOIN查询一个包含年份的表(或者从一个包含任何类型的日历信息的表中过滤年份),但是我手头没有它。我知道我可以创建一个TEMPORARY表并相应地填充它-但是有没有可能创建一个临时的'伪表'作为子查询呢?在伪代码中类似于:SELECT ... FROM (SELECT Year FROM [2015, 2016,...2022]) LEFT JOIN ....
先谢谢你。
3条答案
按热度按时间guz6ccqo1#
一个选项是在以下范围内使用
LEFT JOIN
:然后对缺失的Sales应用
COALESCE
函数。xxslljrj2#
最明显的解决方案(尽管效率很低)是从同一个表中获取一个由年份组成的列表。
然而,这仍然不会列出一年中没有销售额的客户--实际上,您需要一个数据源来生成所有年份和所有客户的列表--这需要一个笛卡尔连接......
(You可能有其他表,查询所有年份和所有客户端的成本较低)
不幸的是,MySQL没有实现row generator的机制。
9gm1akwq3#
我想这对你会有帮助:
How to SELECT based on value of another SELECT
甚至可以内部连接表