显示每个月并计数,如果为空则显示0

时间:2019-08-06 18:08:10

标签: sql-server tsql

我正在使用下面的DDL来显示2018年和2019年几个月的销售数据。我的问题是,显然我们将没有2019年9月至2019年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日$ 1
9月19日$ 0
10月18日$ 1
10月19日$ 0
11月18日$ 1
十一月19 $ 0
12月18日$ 1
12月19日$ 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

1 个答案:

答案 0 :(得分:0)

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

结构将是:id,描述。

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

在使用左/右联接的查询中,您总是缺少月份。

PS:只需一个表即可管理此表,并在多年管理中需要的位置添加一个简单的where条件(或按条件分组)