Строка SQL-сервера с относительным значением? - PullRequest
0 голосов
/ 23 марта 2012

У меня есть эта таблица:

Name   |  money_earned
_______________________

john   |   100
paul   |   200
ringo  |   300
george |   200

Я хочу рассчитать (самым интеллектуальным способом) - возле каждой строки

Каков процент выгоды (каждого битла) - относительно к общей сумме

Так что я хочу такой результат: (сумма 800)

Name   |  money_earned| his_Percentage
__________________________________

john   |   100        |   0.125
paul   |   200        |   0.25
ringo  |   300        |   0.375
george |   200        |   0.25

Спасибо:)

редактировать

Я буду рад найти решение, подобное rollup.

это подсчет суммы, а общая сумма ... что-то вроде этой функции.

Допустим, я хочу, чтобы это было в 1 запросе без объявления дополнительных предварительно рассчитанных значений.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012
select Name,
       money_earned,
       money_earned / sum(money_earned) over() as his_Percentage
from [Table]
2 голосов
/ 23 марта 2012
declare @t table(name varchar(10), money_earned int)

insert @t values('john',100 ),('paul',200 ),('ringo',300 ),('george',200)

select name, money_earned, 
cast(1.0 * money_earned / sum(money_earned) over () as numeric(4,3)) his_Percentage,
cast(100.0 * money_earned / sum(money_earned) over () as numeric(4,1)) REAL_his_Percentage
from @t

Результат:

name       money_earned his_Percentage                REAL_his_Percentage
---------- ------------ ----------------------------- --------------------
john       100          0.125                         12.5
paul       200          0.250                         25.0
ringo      300          0.375                         37.5
george     200          0.250                         25.0
2 голосов
/ 23 марта 2012

Попробуйте это (этот способ должен быть наиболее эффективным с точки зрения производительности)

DECLARE @sum INT
SELECT @sum = SUM(money_earned) FROM table

SELECT Name, money_earned, CAST(money_earned as float) / @sum as his_Percentage 
FROM table

OR

;WITH CTE AS (
    SELECT SUM(money_earned) as summ FROM table
)
    SELECT Name, money_earned, CAST(money_earned as float) / summ as his_Percentage 
    FROM table
    CROSS JOIN CTE

OR

SELECT Name, money_earned, 
    CAST(money_earned as float) / (SELECT SUM(money_earned) FROM table) as his_Percentage 
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...