前50%总价值

时间:2016-03-08 07:24:24

标签: sql

我想获得数值总和小于或等于总价值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)

但它只返回迈克和罗伯特。

1 个答案:

答案 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。因此,mikeskey = 1robert2等等。

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中,但语法或多或少相同。请根据您的数据库进行相应更改。