2016-08-25 13 views
0

このようなデータベースからデータを取り出しました(簡略化のために簡略化しています)、 "パーセント"という列を追加したいと思います。グループ単位でSQLで計算パーセント

ID GRADE PERCENTAGE 
1  10  10/(10+20) * 100 -- THIS PART SHOULD BE SHOWN IN DIGIT 
1  20   . 
2  15   15/(15+24+16) * 100 
2  24 
2  16 
3  29 
4  96 
4  159 
.  . 
.  . 
.  . 

内側の選択がid秒のgarde合計を取得し、事前

+0

を必要としません、それはMySQLやSQL Serverのですか? –

答えて

2

でお願いします。 OVER(PARTITION BY)を使用して

select t.id, t.grade, t.grade * 100/gsum 
from your_table t 
join 
(
    select id, sum(grade) as gsum 
    from your_table 
    group by id 
) tmp on tmp.id = t.id 
0
SELECT t1.ID, 
     t1.GRADE, 
     100.0 * (t1.GRADE/t2.gradeSum) AS PERCENTAGE -- important: multiply 
FROM yourTable t1          -- by 100.0 here 
INNER JOIN 
(
    SELECT ID, SUM(GRADE) AS gradeSum 
    FROM yourTable 
    GROUP BY ID 
) t2 
1

は、SQL Serverに参加

SELECT *, 100*Grade/ SUM(Grade) OVER(PARTITION BY ID) AS Percentage 
FROM (
    VALUES(1, 10),(1,20), (2, 15), (2,24), (2,16), (3,29) 
) your_table (ID, GRADE) 
+0

私はミルオンのような行を持っています。それはすべての値を入力することは不可能です。 – Nayana

+0

サンプルデータです。 'FROM your_table'(行' 2'を上に置き換えてください) –

0
select 
a.id, a.grade 
, case 
    when b.total = 0 then 0 
    else a.grade/b.grade * 100 
    end as percentage 
from 
data a 
cross apply (
    select sum(tot.grade) as total 
    from data tot where a.id = tot.id 
) b 
関連する問題