计数返回空白而不是0

时间:2013-10-07 09:49:42

标签: sql tsql count sql-server-2008-r2 sum

大家好,这里的每个人都是我的代码

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LOAN)) as [Month]
    ,COUNT(PIT.fld_ID)'COUNT'
    ,SUM (PIT.fld_GRAM)'GRAMS'
    ,SUM (PH.fld_AMNT)'PRINCIPAL'
FROM  #AllExpired AE
    INNER JOIN Transactions.tbl_ITEM PIT
    ON AE.fld_MAINID=PIT.fld_MAINID
    INNER JOIN Transactions.tbl_HISTO PH
    ON AE.fld_MAINID =PH.fld_MAINID
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LOAN)))

我遇到的问题是我的 Count 函数如果没有值则不返回0, Sum 函数如果没有结果值则不返回NULL检索,而不只是输出空白,为什么会这样?我该如何解决?

这是示例输出的屏幕截图

A

当然这不是我想要它输出零和空值。请帮帮我,我不知道什么是错的。谢谢。

3 个答案:

答案 0 :(得分:17)

使用GROUP BY子句时,如果源中没有记录,则不能指望输出任何记录。

如果希望SUM和COUNT函数输出0,则不应使用GROUP BY。

原因是当你没有记录时,GROUP BY子句没有任何内容可以分组,然后无法给你任何输出。

例如:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable

将返回一条值为'0'的记录,其中as:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable
GROUP BY [Dummy]

将不会返回任何记录。

答案 1 :(得分:3)

我认为您需要将连接从INNER更改为OUTER以确保即使在tbl_PawnItem中没有相应的记录时也会返回行 -

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) as [Month]
    ,COUNT(PIT.fld_PawnItemID)'COUNT'
    ,SUM (PIT.fld_KaratGram)'GRAMS'
    ,SUM (PH.fld_PrincipalAmt)'PRINCIPAL'
FROM  #AllExpired AE
    LEFT JOIN Transactions.tbl_PawnItem PIT
        ON AE.fld_PawnMainID=PIT.fld_PawnMainID
    LEFT JOIN Transactions.tbl_PawnHisto PH
        ON AE.fld_PawnMainID=PH.fld_PawnMainID
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LoanDate)))

答案 2 :(得分:1)

也许#AllExpired为空,其中一个连接没有返回结果?

记住内部联接需要双方都有结果才能返回,所以因为#AllExpired为空,所以联接不返回任何内容。

将其更改为OUTER联接。