如何在 SQL 服务器结果集中获取 NULL 或零值

How to get NULL or Zero values in SQL Server results set

尝试获取所有提到的帐户(共 9 个)的输出,即使没有 GB.periode = 11

的现有记录

尝试使用 ISNULL(SUM(GB.bdr_val), 0) 但我仍然只得到 GB.reknr = 5210 OR GB.reknr = 5211 OR GB.reknr = 5250 OR GB.reknr = 5340 的输出。

SELECT 
    SUM(GB.bdr_val) AS Total_Material_M, 
    GR.oms25_0 AS Desc2, GB.reknr AS Account
FROM
    [100].[dbo].[gbkmut] GB 
INNER JOIN 
    [100].[dbo].[grtbk] GR ON GB.reknr = GR.reknr
WHERE
    GB.bkjrcode = 2021 
    AND GB.periode = 11 
    AND (GB.reknr = 5000 OR GB.reknr = 5050 OR GB.reknr = 5150 OR 
         GB.reknr = 5200 OR GB.reknr = 5210 OR GB.reknr = 5211 OR 
         GB.reknr = 5250 OR GB.reknr = 5340 OR GB.reknr = 5341)
GROUP BY 
    GR.oms25_0,GB.reknr
ORDER BY 
    GB.reknr ASC

我在下面有一个示例数据库布局,

CREATE TABLE gbkmut
(
    id INT,
    reknr INT,
    bdr_val INT,
    bkjrcode INT,
    periode INT
);

INSERT INTO gbkmut VALUES (1, 5210, 3511, 2021, 11);
INSERT INTO gbkmut VALUES (2, 5211, -40, 2021, 11);
INSERT INTO gbkmut VALUES (3, 5250, 33832, 2021, 11);
INSERT INTO gbkmut VALUES (3, 5340, -16, 2021, 11);

CREATE TABLE grtbk 
(
    id INT,
    reknr INT,
    oms25_0 varchar(60)
);

INSERT INTO grtbk VALUES (1, 5210, 'Description 1');
INSERT INTO grtbk VALUES (2, 5211, 'Description 2');
INSERT INTO grtbk VALUES (3, 5250, 'Description 3');
INSERT INTO grtbk VALUES (4, 5340, 'Description 4');
INSERT INTO grtbk VALUES (5, 5000, 'Description 5');
INSERT INTO grtbk VALUES (6, 5050, 'Description 6');
INSERT INTO grtbk VALUES (7, 5150, 'Description 7');
INSERT INTO grtbk VALUES (8, 5200, 'Description 8');
INSERT INTO grtbk VALUES (9, 5341, 'Description 9');

我仍然需要查询输出来显示所有 Total_Material_MDesc2Account 列,即使特定 [=20] 的值是 0 =] 和 periode 值组合和 SUMS,不确定我在这里做错了什么。

如果我理解正确,您正在寻找 OUTER JOININNER JOIN 将 return 行在两个表的所有条件之间匹配。

对于下面的查询 RIGHT JOIN 将 return 行基于 [dbo].[grtbk] 即使条件不匹配,但行将是 NULL 当行不符合条件GB.bdr_val时,我们需要在聚合函数中使用ISNULL

SELECT 
    SUM(ISNULL(GB.bdr_val,0)) AS Total_Material_M, 
    GR.oms25_0 AS Desc2, 
    GR.reknr AS Account
FROM
    [dbo].[gbkmut] GB 
RIGHT JOIN 
    [dbo].[grtbk] GR ON GB.reknr = GR.reknr
    AND GB.bkjrcode = 2021 
    AND GB.periode = 11 
GROUP BY 
    GR.oms25_0, GR.reknr
ORDER BY 
    GR.reknr ASC

您需要切换联接顺序并将其更改为 LEFT JOIN。您还需要将 GB 的条件移动到 ON 子句中。

SELECT 
    SUM(GB.bdr_val) AS Total_Material_M, 
    GR.oms25_0 AS Desc2, GB.reknr AS Account
FROM
    dbo.grtbk GR
LEFT JOIN 
    dbo.gbkmut GB ON GB.reknr = GR.reknr
    AND GB.bkjrcode = 2021 
    AND GB.periode = 11 
    AND (GB.reknr = 5000 OR GB.reknr = 5050 OR GB.reknr = 5150 OR 
         GB.reknr = 5200 OR GB.reknr = 5210 OR GB.reknr = 5211 OR 
         GB.reknr = 5250 OR GB.reknr = 5340 OR GB.reknr = 5341)
GROUP BY 
    GR.oms25_0,
    GB.reknr
ORDER BY 
    GB.reknr ASC;

db<>fiddle