如何创建按值范围分组的SQL查询

时间:2009-05-08 17:14:47

标签: sql sql-server

我想创建一个sql查询,报告特定范围内结果的百分比。例如

20%的值介于10到20之间

40%的值在20到32.5之间

服务器 - MSSQL

7 个答案:

答案 0 :(得分:2)

GROUP BY CASE 
         WHEN VALUE >= 10 AND VALUE <= 20 THEN '20%'
         WHEN VALUE > 20 AND VALUE <= 32.5 THEN '40%' ELSE '0' END

你需要覆盖所有可能的值,因此ELSE 0.你可能想要做一些不同的事情,但它应该给你一个开始。


基于Joel Gauvreau的评论:

SUM(CASE WHEN VALUE >=10 AND VALUE <= 20 THEN 1.0 ELSE 0.0 END) / COUNT(*),
SUM(CASE WHEN VALUE > 20 AND VALUE <= 32.5 THEN 1.0 ELSE 0.0 END) / COUNT(*)

或者在查询结束时使用COMPUTE语句。

答案 1 :(得分:2)

这将为您提供每个范围的计数,您可以从那里轻松确定百分比:

declare @ranges table (beginInclusive float, endExclusive float)
insert @ranges (beginInclusive, endExclusive)
    select 10, 20
    union all select 20, 32.5

select
    r.beginInclusive,
    r.endExclusive,
    count(*)
from t join @ranges on t.RangedValue >= r.beginInclusive and t.RangedValue < r.endExclusive
group by 
    r.beginInclusive,
    r.endExclusive    

答案 2 :(得分:2)

SELECT B.Description, Total = COUNT(*) / CONVERT(money, (SELECT COUNT(*) FROM Target T2))
FROM Target T
JOIN (
    SELECT  Description = '0 to 10', LBound = 0, UBound = 10 
    UNION ALL 
    SELECT Description = '10 to 20', LBound = 10, UBound = 20
) B ON T.Value >= LBound AND T.Value < B.UBound
GROUP BY B.Description

答案 3 :(得分:0)

我通常会使用子查询并获取范围计数并加入总计以获得百分比。类似的东西:

SELECT 
  RangeCount/CNT as Percentage,
  Range
FROM 
(
SELECT
  Count(*) AS CNT
FROM
  SomeTable
) AS Total
LEFT JOIN 
(
SELECT
  CASE Val <= 10 then
       '0 up to 10'
  ELSE 
       CASE when Val <= 20
         '11 to 20'
       ELSE 
        '> 20'
       END
    END
  END AS Range,
  COUNT(*) AS RangeCount
FROM 
   SomeTable
GROUP BY
   Range
) AS RangeTotals

答案 4 :(得分:0)

Declare @1 as int
Declare @2 as int
Declare @TotalRows as int

set @1 = (Select COUNT(id) FROM dbo.Table_1 WHERE id >= 10 and id <= 20)
set @2 = (Select COUNT(id) FROM dbo.Table_1 WHERE id > 20 AND id <= 32.5);
set @TotalRows = (Select Count(id) from dbo.Table_1);

SELECT CAST(((@1 * 100)/@TotalRows) as nvarchar(32)) + '%', CAST(((@2 * 100)/@TotalRows) as nvarchar(32)) + '%';

有点复杂,但确实有用......我想......

dbo.Table_1只有1列'id',它的类型为int。

答案 5 :(得分:0)

如果这是您将要定期进行的操作,那么您可以创建一个包含范围的表格以及这些范围的构成。如果没有,您可以在表变量或临时表中设置它们并加入到它。它基本上是JohnOpincar的解决方案,但是使用表而不是子查询。

此外,在您的示例中,您列出“10到20”和“20到32.5”。如果行正好是20,那么行在哪里计算?在交付最终解决方案之前,您应该确保在那一点上明确要求。

答案 6 :(得分:0)

乔尔的回答对我来说似乎是最好的方式。发布解释查询,并且因为答案有一个整数除法和/计数,它将返回1或0而不是百分比。

对于20 - > 32.5范围:

select CAST(SUM(
    CASE WHEN 20 < field AND field <= 32.5 THEN 1 ELSE 0 END
    ) as float) / COUNT(*) * 100.0
from table

当值在范围内时,案例返回1。因为没有group by子句,所以总和会为表中的每一行添加大小写的结果。转换为浮点数,除以行数= count(*),然后得到百分比。

你也可以这样写:

select SUM(
    CASE WHEN 20 < field AND field <= 32.5 THEN 1.0 ELSE 0.0 END
    ) / COUNT(*) * 100
from table

这里CASE将导致浮点数1.0而不是整数1。