0

各プロジェクトのパーセンテージ範囲を数える簡単な計算を行う必要があります。これは非常に単純で簡単なクエリのように見えますが、私の結果 (10% 未満、50% を超える、100% を超えるパーセンテージのカウントが正しく返されず、その理由を理解するのに苦労しています。 db2 で、これが私のデータのサンプルです。

ここに画像の説明を入力

間違った結果 (「24」) を返すクエリは次のとおりです。

SELECT 
                COUNT(*)
            FROM Fact_Table
            WHERE Dept_NAME = 'sales'
                AND PERCENTAGE_USED > '100.00%'
4

4 に答える 4

1

あなたが何を期待しているのか、またはフィールドのデータ型がどのように設定されているのかはよくわかりませんが、これは、比較のために数値ではなく文字列値を比較することにかかっている可能性があります > '100.00%'

于 2013-09-10T13:38:39.730 に答える
1

おそらく、数値ではなく文字列を比較しているためです。文字列 '2%' は、文字列 '100%' よりも "大きい" です。つまり、文字列 '100%' の後に並べ替えられています。実際にファクト テーブルにパーセンテージを文字列として格納している場合 (これは賢明ではありません)、比較の前にパーセンテージを数値に変換する必要があります。

于 2013-09-10T13:40:04.487 に答える
1

値が数値では'%'なく文字列 (したがって) として格納されているようです。

それらを数値として比較し、同時に範囲を実行する方法は次のとおりです。

SELECT (case when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 10 then '<10'
             when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 50 then '10-50'
             when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 100 then '50-100'
             when cast(replace(PERCENTAGE_USED, '%', '') as float) > 100 then '>100'
        end) as range,
       COUNT(*)
WHERE Dept_NAME = 'sales'
GROUP BY (case when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 10 then '<10'
               when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 50 then '10-50'
               when cast(replace(PERCENTAGE_USED, '%', '') as float) <= 100 then '50-100'
               when cast(replace(PERCENTAGE_USED, '%', '') as float) > 100 then '>100'
          end);
于 2013-09-10T13:42:42.150 に答える
0

クエリの where 句は文字列を比較しています。数値を比較したい。

于 2013-09-10T13:39:24.923 に答える