我想创建一个sql查询,报告特定范围内结果的百分比。例如
20%的值介于10到20之间
40%的值在20到32.5之间
服务器 - MSSQL
答案 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。