在SQL中遇到被零除的情况
所以,我有一个查询,我可以用一些公式和类似的东西得到一些值。当查询有值时,它将正常工作,但如果我没有值,在除法公式中,它将给出已知错误 除以零 以下是查询:在SQL中遇到被零除的情况,sql,sql-server,tsql,Sql,Sql Server,Tsql,所以,我有一个查询,我可以用一些公式和类似的东西得到一些值。当查询有值时,它将正常工作,但如果我没有值,在除法公式中,它将给出已知错误 除以零 以下是查询: WITH TrashFile AS( SELECT FileType AS[Extension], COUNT(*) AS [Nº of files], CAST(((COUNT(FileSize) * 100.0) / (SELECT COUNT(*) FROM InfoFile)) AS DECIMAL(10, 2)) AS[Perce
WITH TrashFile AS(
SELECT FileType AS[Extension],
COUNT(*) AS [Nº of files],
CAST(((COUNT(FileSize) * 100.0) / (SELECT COUNT(*) FROM InfoFile))
AS DECIMAL(10, 2)) AS[Percentage(%)],
CAST((SUM(FileSize) / 1024.0) AS DECIMAL(10,1)) AS [Total(KB)],
NULL AS [Converted to MB],
NULL AS [Converted to GB],
MIN(COUNT(*)) OVER() * 100.0 / (SUM(COUNT(*)) OVER()) AS[Min.Percentage(%)],
MAX(COUNT(*)) OVER() * 100.0 / SUM(COUNT(*)) OVER() AS[Max.Percentage(%)]
FROM InfoFile
GROUP BY FileType)
SELECT[Extension],
[Nº of files],
[Percentage(%)],
[Total(KB)],
[Converted to MB],
[Converted to GB],
NULL AS[Min.Percentage(%)],
NULL AS[Max.Percentage(%)]
FROM TrashFile
UNION ALL
SELECT '-----------------------------',
COUNT('Nº de extensions'),
((COUNT(FileType) * 100) / (SELECT COUNT(FileType) FROM InfoFile)),
CAST((SUM(FileType) / 1024.0) AS DECIMAL(10,1)),
CAST((SUM(FileType) / 1024.0 / 1024.0) AS DECIMAL(10,5)),
CAST((SUM(FileType) / 1024.0 / 1024.0 / 1024.0) AS DECIMAL(10,9)),
CAST(((SELECT MAX([Min.Percentage(%)]) FROM TrashFile))
AS DECIMAL(10,2)) AS[Min.Percentage(%)] ,
CAST((SELECT MAX([Max.Percentage(%)]) FROM TrashFile)
AS DECIMAL(10,2)) AS[Max.Percentage(%)]
FROM InfoFile
你知道我该怎么解决吗?在处理类似情况时,我会在案例陈述中插入我所有的分歧:
当[分母]>0时,则值/分母否则0结束。当其中一个
选择计数(*)
子选择返回0条记录时,您的查询将失败
有两种方法可以处理此问题:
COUNT()
s中永远不会返回0条记录ISNULL
和NULLIF
捕获并处理您的除法0:ISNULL(MAX(COUNT(*)OVER()*100.0/NULLIF(SUM(COUNT(*)OVER(),0),0)
这是因为将任何数字除以NULL
将返回NULL
,这意味着您刚刚避免了除以零的错误。然后,您可以将此NULL
替换为您想要显示的内容。在上面的示例中,它将返回一个0
。如果您想替换稍后要处理的其他内容,请将其替换为下面的
:
ISNULL(MAX(COUNT(*)OVER()*100.0/NULLIF(SUM(COUNT(*)OVER(),0),)
您可以使用CASE-WHEN语句来避免被零除
SELECT FileType AS[Extension],
COUNT(*) AS [Nº of files],
CASE WHEN (SELECT COUNT(*) FROM InfoFile) > 0
THEN
CAST(((COUNT(FileSize) * 100.0) / (SELECT COUNT(*) FROM InfoFile))
ELSE
NULL
END AS Alias,
... FROM Table
在该语句中有许多地方,您将除以计数(*)或类似值的结果。这些计数值可能为零,这将导致发生被零除的错误。解决这个问题的一种方法是使用NULLIF函数,它将零值替换为NULL。这将导致计算返回NULL而不是被零除的错误-如果NULL值不是您想要的值,您可以用ISNULL包围计算,并用您喜欢的任何值替换NULL
WITH TrashFile AS(SELECT FileType AS [Extension],
COUNT(*) AS [Nº of files],
CAST(((COUNT(FileSize) * 100.0) / (SELECT NULLIF(COUNT(*), 0)
FROM InfoFile))
AS DECIMAL(10, 2)) AS [Percentage(%)],
CAST((SUM(FileSize) / 1024.0) AS DECIMAL(10,1)) AS [Total(KB)],
NULL AS [Converted to MB],
NULL AS [Converted to GB],
MIN(COUNT(*)) OVER() * 100.0 / NULLIF(SUM(COUNT(*)), 0) OVER()) AS [Min.Percentage(%)],
MAX(COUNT(*)) OVER() * 100.0 / NULLIF(SUM(COUNT(*)), 0) OVER()) AS [Max.Percentage(%)]
FROM InfoFile
GROUP BY FileType)
SELECT [Extension],
[Nº of files],
[Percentage(%)],
[Total(KB)],
[Converted to MB],
[Converted to GB],
NULL AS [Min.Percentage(%)],
NULL AS [Max.Percentage(%)]
FROM TrashFile
UNION ALL
SELECT '-----------------------------',
COUNT('Nº de extensions'),
((COUNT(FileType) * 100) / (SELECT NULLIF(COUNT(FileType), 0) FROM InfoFile)),
CAST((SUM(FileType) / 1024.0) AS DECIMAL(10,1)),
CAST((SUM(FileType) / 1024.0 / 1024.0) AS DECIMAL(10,5)),
CAST((SUM(FileType) / 1024.0 / 1024.0 / 1024.0) AS DECIMAL(10,9)),
CAST(((SELECT MAX([Min.Percentage(%)]) FROM TrashFile))
AS DECIMAL(10,2)) AS[Min.Percentage(%)] ,
CAST((SELECT MAX([Max.Percentage(%)]) FROM TrashFile)
AS DECIMAL(10,2)) AS[Max.Percentage(%)]
FROM InfoFile
你可以很容易地在谷歌上搜索这个问题的答案,包括很多问题本身,比如这个:。答案很好,但我不认为SUM(COUNT(*)OVER()
可以返回0
,如果查询中有groupby
子句。SUM函数需要MIN(COUNT(*)OVER()*100.0/(NULLIF)中的1个参数(总和(计数(*),0))超过())为[最小百分比(%)],
这个答案在数学上是不正确的。如果答案没有定义,你不应该返回一个零,除非你有一个非常令人信服的理由这样做,即使这样,你也可能会在链的前面看到一个数据或逻辑问题。另外,我发现对所有负分母返回一个零是很奇怪的。分子/nullif(分母,0)
是SQL Server中解决此问题的更优雅(正确)的解决方案之一。