首页 > 解决方案 > 显示每个月并计数,如果为 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

标签: sql-servertsql

解决方案


您可以简单地添加一个包含 12 条记录(每个月一条)的月份查找表

结构将是:id,描述。

在现有表上,您可以按 id 引用月份:更少的空间更多的连接性能。

在使用左/右连接的查询中,您将始终缺少月份。

PS:只需要一个表来管理它,并在需要多年管理的地方添加一个简单的 where 条件(或按条件分组)


推荐阅读