2016-12-12 7 views
-1

私はいくつかの数式とそのようなものを使っていくつかの値を得ることができるクエリを持っています。クエリが値を持っている場合は、それが正常に動作しますが、私は値を持たない場合は、分割式で、それは私にSQLで遭遇したゼロで割り算

遭遇ゼロによる分割既知のエラーを

与えるこれは、クエリは次のとおりです。

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 

どうすれば解決できますか?似たような状況に対処する、私はcase文の中にすべての私の格差を挿入

+6

することはでき簡単にGoogleのこの1のように、SO自体に、ここで多くを含め、この質問に対する答えは、のために:[?SQLでエラー「ゼロによる除算」を回避する方法](のhttp://のstackoverflow。 com/questions/861778/how-to-avoid-the-zero-in-error-in-sqlを参照してください)。 – 3N1GM4

答えて

1

:結果として

ケース[分母]> 0その後、他の値/分母0終了。

+3

この回答は数学的に間違っています。非常に魅力的な理由がないかぎり、答えが定義されていない場所でゼロを返すべきではありません。さらにチェーンの早い段階でデータやロジックの問題を見ている可能性もあります。また、すべての負の分母についてゼロを返すことは奇妙であることがわかります。'numerator/nullif(分母、0)'は、SQL Serverのこの問題に対するより洗練された(そして正しい)解決策の1つです。 –

0

SELECT COUNT(*)サブ選択のいずれかが0レコードを返すと、クエリが終了します。

これを処理する2つの方法があります:あなたはCOUNT()秒0のレコード

  • トラップへISNULLNULLIFを使用し、0であなたの除算を扱うを返すことはありませんように

      は、クエリ/集計を変更

    ISNULL(MAX(COUNT(*)) OVER() * 100.0/NULLIF(SUM(COUNT(*)) OVER(),0) ,0)

    により、任意の数を割るので、これは動作しますはNULLを返します。これは、ちょうどDivide by Zeroエラーを回避したことを意味します。このNULLを代わりに表示したいものに置き換えることができます。上の例では、0を返します。あなたはそれが下の<value>に代わりに、後に処理される何か他のものに置き換えたい場合:

    ISNULL(MAX(COUNT(*)) OVER() * 100.0/NULLIF(SUM(COUNT(*)) OVER(),0) ,<value>)

  • +1

    良い答えですが、クエリに 'GROUP BY'節がある場合、' SUM(COUNT(*))OVER() 'は' 0'を返すことはできません。 –

    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 
    
    0

    このステートメントには、COUNT(*)または同様の値の結果で除算する場所がいくつかあります。これらのCOUNT値はゼロであり、DIVIDE BY ZEROエラーが発生する可能性があります。これを回避する方法の1つは、ゼロ値をNULLに置き換えるNULLIF関数を使用することです。これは、DIVIDE BY ZEROエラーの代わりに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 
    
    +0

    SUM関数は、MIN(COUNT(*)、0)OVER()* 100.0 /(NULLIF(SUM(COUNT(*)、0))OVER())で最小1つの引数を必要とします。[Min.Percentage )]、 ' – LeugimSnitram

    関連する問題