我正在尝试编写一个SQL查询来显示每个类别的总和。 问题是我需要每个类别的总和,即使总和为零,它仍应显示结果。
我是通过使用DAL层来实现这一点的,所以通过C#我正在使用Access 2010数据库。
这是我目前的工作查询:
SELECT SUM(f.bedrag) AS totaal, c.omschrijving, Limiet.maximumBedrag
FROM ((Financien f INNER JOIN
Categorie c ON f.categorieId = c.id) INNER JOIN
Limiet ON f.limietId = Limiet.id)
WHERE (f.inkomstOfUitgave = 1)
GROUP BY f.categorieId, c.omschrijving, Limiet.maximumBedrag
现在在SUM函数之上我还需要检查空值,如果类别的总和为0,它应该显示0.现在所有0的结果都被过滤掉,但我必须看到它们。< / p>
有人知道如何修复它吗?我尝试了IsNull()
和NZ
,但我无法让它发挥作用。
以下是查询结果的屏幕截图。
正如你所看到的,我得到两个结果,但是如果查询显示0和0的结果,我应该得到7。
有人知道如何解决这个问题吗?
答案 0 :(得分:1)
如果问题是关于如何在Access查询中将Null显示为0,请考虑这个简单查询。它会在SumOfbedrag
列中返回Null的一些行。
SELECT y.categorieId, Sum(y.bedrag) AS SumOfbedrag
FROM YourTable AS y
GROUP BY y.categorieId
使用该SQL作为子查询,包含的查询可以使用IIf()
表达式将Null转换为0。
SELECT
sub.categorieId,
IIf(sub.SumOfbedrag Is Null, 0, sub.SumOfbedrag) AS totaal
FROM
(
SELECT y.categorieId, Sum(y.bedrag) AS SumOfbedrag
FROM YourTable AS y
GROUP BY y.categorieId
) AS sub;
然而,再次查看您的屏幕截图让我觉得问题实际上是您的查询不包含totaal
列中包含Null的行。在这种情况下,在将其与GROUP BY
聚合之前检查基础数据。查看此查询是否返回任何行...
SELECT f.bedrag, c.omschrijving, Limiet.maximumBedrag
FROM
(Financien f
INNER JOIN Categorie c
ON f.categorieId = c.id)
INNER JOIN Limiet
ON f.limietId = Limiet.id
WHERE
f.inkomstOfUitgave = 1
AND f.bedrag Is Null
如果该查询没有返回任何行,我最好的猜测是,您的一个或两个联接应该从INNER
更改为LEFT JOIN
或RIGHT JOIN
。
答案 1 :(得分:0)
同时显示0值的答案是: 答案是由“drch”做出的,我非常感谢他! :)
SUM(IIF(IsNULL(f.bedrag), 0, f.bedrag)) AS bedrag
还有许多其他错误,这是完整的查询:
SELECT c.omschrijving as Omschrijving, SUM(IIF(IsNULL(f.bedrag), 0, f.bedrag)) AS bedrag, l.maximumBedrag as maximumBedrag
FROM ((Categorie c LEFT OUTER JOIN
Financien f ON f.categorieId = c.id) LEFT OUTER JOIN
Limiet l ON l.categorieId = c.id)
WHERE (f.inkomstOfUitgave IS NULL) OR
(f.inkomstOfUitgave = 1)
GROUP BY c.id, f.categorieId, c.omschrijving, l.maximumBedrag