20

今天是个好日子。这是我的代码:

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。相反,它只是输出空白。为什么会这样,我该如何解决?

这是示例输出的屏幕截图。

一种

当然这不是我想要的。我希望它输出零和空值。请帮助我,我不知道出了什么问题。谢谢你。

4

3 回答 3

30

当您的源中不存在任何记录时,您不能期望在使用 GROUP BY 子句时输出任何记录。

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

原因是当您没有记录时,GROUP BY 子句没有可分组的内容,因此无法为您提供任何输出。

例如:

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

将返回一条值为“0”的记录,其中:

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

将不返回任何记录。

于 2013-10-07T09:59:14.343 回答
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)))
于 2013-10-07T09:53:44.630 回答
1

也许#AllExpired是空的,或者其中一个连接没有返回结果?

记住内连接需要两边的结果才能返回,所以因为#AllExpired是空的,所以连接什么也不返回。

将其更改为 OUTER 联接。

于 2013-10-07T09:52:16.770 回答