如何在 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_M
、Desc2
和 Account
列,即使特定 [=20] 的值是 0
=] 和 periode
值组合和 SUMS
,不确定我在这里做错了什么。
如果我理解正确,您正在寻找 OUTER JOIN
,INNER 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;
尝试获取所有提到的帐户(共 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_M
、Desc2
和 Account
列,即使特定 [=20] 的值是 0
=] 和 periode
值组合和 SUMS
,不确定我在这里做错了什么。
如果我理解正确,您正在寻找 OUTER JOIN
,INNER 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;