计数和百分比范围

时间:2013-09-10 13:33:40

标签: sql db2 aggregate-functions

我需要做一些简单的计算,计算每个项目的百分比范围。似乎这应该是一个非常简单直接的查询,但我的结果(百分比<10%,> 50%,&> 100%的数量回归不正确,我无法弄清楚原因。我'我在db2中工作,这是我的数据样本。

enter image description here

我的返回错误结果(“24”)的查询是:

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

4 个答案:

答案 0 :(得分:1)

我不太清楚你期望的是什么或者字段数据类型被设置为什么,但是这可能是你比较字符串值而不是数字字符串进行比较&gt; '100.00%'

答案 1 :(得分:1)

这可能是因为你在比较字符串而不是数字。字符串'2%'是“大于”,即在字符串'100%'之后排序。如果你真的在事实表中将百分比存储为字符串,这不是很明智,那么在比较之前你需要将它们转换为数字。

答案 2 :(得分: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);

答案 3 :(得分:0)

您的查询的where子句正在比较字符串。你想比较数字。