我想获得数值总和小于或等于总价值50%的数据。
以下是一个例子:
name Score
mike 1000
robert 900
scott 500
jack 500
tina 500
albert 500
jose 500
arnel 300
john 200
kelly 200
george 100
sophia 50
如果我总结他们所有的分数,我得到5250,总数的50%是2625.我需要得分在总分的50%之内:
name Score summation condition
mike 1000 1000 true
robert 900 1900 true
scott 500 2400 true
jack 500 2900 false
tina 500 3400 false
albert 500 3900 false
jose 500 4400 false
arnel 300 4700 false
john 200 4900 false
kelly 200 5100 false
george 100 5200 false
sophia 50 5250 false
所有条件都是真的输出。
注意:分数必须是从最高到最低的顺序。
我有这段代码。
select name, score
from
(
select name, SUM(a.score) over (order by score desc) sumvalues, score
from dbo.tally_count a
) as x
where sumvalues <= (select sum(score) * 0.5 from tally_count)
但它只返回迈克和罗伯特。
答案 0 :(得分:2)
您的查询存在的问题是它没有按照您的需要执行累积总和,因为有多个names
具有相同的score
。
如果您运行内部查询,您将获得此输出
select name, SUM(a.score) over (order by score desc) sumvalues, score from tally_count a
Output
NAME SUMVALUES SCORE
mike 1000 1000
robert 1900 900
tina 4400 500
jack 4400 500
scott 4400 500
albert 4400 500
jose 4400 500
arnel 4700 300
john 5100 200
kelly 5100 200
george 5200 100
sophia 5250 50
如果您希望按照您提供的顺序输出,则需要插入一列来确定顺序。我用了一个专栏skey
。因此,mike
,skey
= 1
,robert
,2
等等。
select name, SUM(a.score) over (order by score desc,skey) sumvalues, score from tally_count a
output
NAME SUMVALUES SCORE
mike 1000 1000
robert 1900 900
scott 2400 500
jack 2900 500
tina 3400 500
albert 3900 500
jose 4400 500
arnel 4700 300
john 4900 200
kelly 5100 200
george 5200 100
sophia 5250 50
现在使用剩下的查询来获得所需的输出。
注意:我尝试的查询是在Oracle中,但语法或多或少相同。请根据您的数据库进行相应更改。