【问题标题】:Count Returning blank instead of 0计数返回空白而不是 0
【发布时间】:2013-10-13 20:05:21
【问题描述】:

大家好。这是我的代码:

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

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

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

【问题讨论】:

  • 您希望在Month 列中出现什么值 - SQL Server 是否只需要神奇地为那里补一个值?
  • 但是当有 no 行供它处理时 - 你想要的结果为 0 的条件 - 它会从什么计算它?
  • 哦,我现在明白了 :) 感谢@Damien_The_Unbeliever 这次你再次帮助了我 :)

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


【解决方案1】:

当您的源中不存在任何记录时,您不能期望在使用 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]

将不返回任何记录。

【讨论】:

  • 我之所以使用 group by 是因为这个错误Msg 8120, Level 16, State 1, Line 2 Column '#AllExpired.fld_LoanDate' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 有什么建议吗?如何在不使用 group by 的情况下消除错误?
  • 好吧,如果您想要每个贷款日期月份的总计数、克数和本金列表,则不能删除 GROUP BY 子句。一个丑陋的解决方法是,如果您希望原始查询在没有记录的情况下返回带有 0 的行,请在查询中添加类似这样的内容:UNION SELECT NULL AS [Month], 0 AS [COUNT], 0 AS [GRAMS], 0 AS [PRINCIPAL] WHERE (SELECT COUNT(*) FROM #AllExpired) = 0,但更好的解决方案是让您的应用程序处理原始查询查询不返回任何行。
  • 这个问题还有其他方法可以解决,你也可以用COALESCE和每个字段在结果为NULL时返回0。或者使用相关子查询来确保始终返回“顶级”数据,任何聚合函数都将返回 0。
  • @Tony:COALESCE 不起作用,因为一开始没有记录。您建议的其他方法,使用“顶级”数据,也许 LEFT JOINs 比我的解决方案优雅得多。
  • @Dan - 是的,COALESCE 仅在聚合字段可以为 NULL 时返回零有用。相关子查询是一个很好的解决方案,但前提是它不会导致性能问题,它在大型数据集上可能会很慢。
【解决方案2】:

我想您需要将连接从 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)))

【讨论】:

    【解决方案3】:

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

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

    将其更改为 OUTER 联接。

    【讨论】:

    • 是的,它是空的,好吗?它不应该输出零吗?当我使用函数计数>?
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2021-10-08
    • 2018-04-20
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多