Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中遇到被零除的情况_Sql_Sql Server_Tsql - Fatal编程技术网

在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中解决此问题的更优雅(正确)的解决方案之一。