sql-server - 显示每个月并计数,如果为 Null,则为 0
问题描述
我正在使用下面的 DDL 来显示 2018 年和 2019 年几个月的销售数据。我的问题是,显然我们将没有 2019 年 9 月至 12 月的数据,但我需要返回并显示 0 金额。
我如何需要编辑此查询,以便返回 18 和 19 的所有月份 1 - 12?
CREATE TABLE PrevYear (
[EmployeeNumber] char(8) NOT NULL,
[SaleAmount] int DEFAULT NULL,
[SaleDate] date NOT NULL,
[EmployeeName] char(17) NOT NULL
);
CREATE TABLE CurrentYear (
[EmployeeNumber] char(8) NOT NULL,
[SaleAmount] int DEFAULT NULL,
[SaleDate] date NOT NULL,
[EmployeeName] char(17) NOT NULL
);
INSERT INTO CurrentYear
VALUES ('ea12', '100', '2019-01-10', 'Sam Smith');
INSERT INTO CurrentYear
VALUES ('ea12', '199', '2019-01-13', 'Sam Smith');
INSERT INTO CurrentYear
VALUES ('ea12', '100', '2019-03-01', 'Sam Smith');
INSERT INTO CurrentYear
VALUES ('ls22', '100', '2019-05-01', 'Sam Smith');
INSERT INTO PrevYear
VALUES ('ea12', '100', '2018-01-10', 'Sam Smith');
INSERT INTO PrevYear
VALUES ('ea12', '199', '2018-01-13', 'Sam Smith');
INSERT INTO PrevYear
VALUES ('ea12', '100', '2018-03-01', 'Sam Smith');
INSERT INTO PrevYear
VALUES ('ls22', '100', '2018-05-01', 'Sam Smith');
我想要的查询输出是:
1月18日 $1 1
月19日 $1
2月18日 $1
2月19日 $1
3月18日 $1
3月19日 $1
4月18日 $1
4月19日 $1
5月18日 $1
5月19日 $1
6月18日 $1
6月19日 $1
7月18日 $1
7月19日 $1
8月18日 $1
8月19日 $1
9月18日19 年
9 月1 美元
10 月 18 日 0 美元10
月 19 日 1 美元
11 月 18 日 0 美元
11 月 19 日 1 美元 12 月 18 日 0
美元 12 月 18 日 1
美元 0 美元
这是我的查询
SELECT Month, Sum(ia) AS SaleAmount
FROM (SELECT Date_format(saledate, '%m-%Y') AS Month,
employeename,
Sum(SaleAmount) AS IA
FROM CurrentYear
WHERE employeename = 'Sam Smith'
GROUP BY Date_format(saledate, '%m-%Y'),
employeename
UNION ALL
SELECT Date_format(saledate, '%m-%Y') AS Month,
employeename,
Sum(SaleAmount) AS IA
FROM PrevYear
WHERE employeename = 'Sam Smith'
GROUP BY Date_format(saledate, '%m-%Y'),
employeename) previousQuery
GROUP BY month
ORDER BY month
解决方案
您可以简单地添加一个包含 12 条记录(每个月一条)的月份查找表
结构将是:id,描述。
在现有表上,您可以按 id 引用月份:更少的空间更多的连接性能。
在使用左/右连接的查询中,您将始终缺少月份。
PS:只需要一个表来管理它,并在需要多年管理的地方添加一个简单的 where 条件(或按条件分组)
推荐阅读
- javascript - 在 ASP.Net Core 5 MVC 控制器中,当传递一个包含小数的 JSON 对象 FromBody 时,模型始终为空
- c++ - 预编译头文件clang重新定义错误
- machine-learning - RLlib PPO 连续动作在 total_loss = inf 之后似乎变成了 nan?
- python-3.x - 当我使用 for 循环和随机森林回归时,定义函数(函数)的输出不是预期的
- javascript - 为什么即使我不导入/需要顶部的模块,我的节点文件的依赖项也能工作?
- javascript - 如何在我制作的nodejs中导出一个函数
- python - 如何对连续元组进行分组并通过 Python 在列表中选择最大一个?
- julia - 如何在 Flux.jl 中使用损失函数
- python-3.x - Python - 循环文件并按文件存储事件
- twitter - 使用 twarc 时如何避免 dquote?