SQL Server:如何包含可为空的分组值

SQL Server:如何包含可为空的分组值,sql,sql-server,Sql,Sql Server,我有以下SQL查询 SELECT cs.group, cs.code, ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 1 THEN cs.amount ELSE 0 END),0) as a_jan, ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 2 THEN cs.amount ELSE 0 END),0) as a_feb, ISNULL

我有以下SQL查询

SELECT
    cs.group,
    cs.code,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 1 THEN cs.amount ELSE 0 END),0) as a_jan,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 2 THEN cs.amount ELSE 0 END),0) as a_feb,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 3 THEN cs.amount ELSE 0 END),0) as a_mar,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 4 THEN cs.amount ELSE 0 END),0) as a_abr,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 5 THEN cs.amount ELSE 0 END),0) as a_may,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 6 THEN cs.amount ELSE 0 END),0) as a_jun,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 7 THEN cs.amount ELSE 0 END),0) as a_jul,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 8 THEN cs.amount ELSE 0 END),0) as a_ago,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 9 THEN cs.amount ELSE 0 END),0) as a_sep,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 10 THEN cs.amount ELSE 0 END),0) as a_oct,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 11 THEN cs.amount ELSE 0 END),0) as a_nov,
    ISNULL(SUM(CASE WHEN datepart(mm,cs.scheduledate) = 12 THEN cs.amount ELSE 0 END),0) as a_dic,
    ISNULL(SUM(cs.amount),0) as a_cds
FROM
    employee_statement cs
WHERE
    datepart(yyyy,cs.startdate) = 2018
GROUP BY
    cs.group,
    cs.code
此查询返回如下表:

select g.group, c.code, . . .
from (select distinct group from employee_statement) g cross join
     (select distinct code from employee_statement) c left join
     employee_statement cs
     on cs.group = g.group and cs.code = c.code and
        cs.startdate >= '2018-01-01' and cs.startdate < '2019-01-01'
group by g.group, c.code;

GROUP是一个动态值,我可以对其进行硬编码,因为它不会发生太多变化,CODE是一个固定值列表

所以我需要的是,无论特定的
code
没有行,我都会得到值为0的行

例如:


有线索吗?谢谢

使用
交叉联接
生成行,使用
左联接
分组方式
获得所需的结果:

查询的结构如下所示:

select g.group, c.code, . . .
from (select distinct group from employee_statement) g cross join
     (select distinct code from employee_statement) c left join
     employee_statement cs
     on cs.group = g.group and cs.code = c.code and
        cs.startdate >= '2018-01-01' and cs.startdate < '2019-01-01'
group by g.group, c.code;

这既不需要
ISNULL()
也不需要
COALESCE()
(我的首选版本),因为您有
ELSE 0
。我认为
MONTH()
DATEPART()
更容易理解,谢谢。我用这种方法试过,结果也一样:)有什么线索吗?@VAAA。对
where
条件应该在
on
子句中(我更改了答案)。