打个比方,表结构如下:
user value
-----------
A 10
B 2
...
假设一共有200行数据。
现在可以按照value字段排序。我现在需要求这200行数据按value值排序后在所有数据中的百分比位置。例如如果value值最大的数据应该为99%,表示其所处的位置在99%之上。
不知道表达清楚没有。
应该怎么求啊?
user value
-----------
A 10
B 2
...
假设一共有200行数据。
现在可以按照value字段排序。我现在需要求这200行数据按value值排序后在所有数据中的百分比位置。例如如果value值最大的数据应该为99%,表示其所处的位置在99%之上。
不知道表达清楚没有。
应该怎么求啊?
select value , cast(count(*) / (select count(*) cnt from tb) as decimal(18,2)) as rate from tb group by value order by rate desc
order by value*1.0/(select sum(value) from ta where user=a.user)desc
而是该value值在总的value值中所处的位置。
比如5行的数据:
A Value
---------
1 100
2 50
3 30
4 20
5 8那么得到的结果value值为100的最高,所处的位置在80%以上,value值为50的所处位置在60%以上。
以下为显示99%
select *,
百分比=
rtrim(cast(
(value*1.0/(select sum(value) from ta where user=a.user))*100 as decimal(15,2)))+'%'
select * from ta as a
order by 百分比 desc
insert @ta select 1, 100
insert @ta select 2, 50
insert @ta select 3, 30
insert @ta select 4, 20
insert @ta select 5, 8select *,
[百分比]=rtrim(
cast(Value*1.0/(select sum(Value)from @ta)*100 as decimal(15,2))
)+'%'
from @ta a
order by [百分比] desc(1 行受影响)
A Value 百分比
----------- ----------- ------------------------------------------
4 20 9.62%
1 100 48.08%
5 8 3.85%
2 50 24.04%
3 30 14.42%(5 行受影响)
insert @ta select 1, 100
insert @ta select 2, 50
insert @ta select 3, 30
insert @ta select 4, 20
insert @ta select 5, 8select *,
[百分比]=rtrim(
cast(Value*1.0/(select sum(Value)from @ta)*100 as decimal(15,2))
)+'%'
from @ta a
order by (
cast(Value*1.0/(select sum(Value)from @ta)*100 as decimal(15,2))
) descA Value 百分比
----------- ----------- ------------------------------------------
1 100 48.08%
2 50 24.04%
3 30 14.42%
4 20 9.62%
5 8 3.85%(5 行受影响)
对Value 排倒序,以value=50为例,百分数为 1-[(count(value>=50) )/count(all)]
上面只是逻辑表达式,不知道LZ是不是这个意思
是这样的。以上面5行的数据为例。
现在一共有5行数据,value为100的在这5行数据中最大,所以排在最前面,应该为100%;
value为50的比其他3行要大,只比100的小,所以位置应该为80%,依次类推。
value为30的位置为60%,value为20的位置为40%,
value为8的比所有的都小,所以位置为20%。
因为只有5行数据,所以最小的位置也是20%。如果数据很多的话,可能最小的就最接近0%.