2012-02-24 84 views
0

我有一個表以下值idamtSQL-如何找到百分比

id   amt  amt% 
1   500  16.7 
2   600  20 
3   900  30 
4   1000  33.3 
----------------------------- 
      3000  100% 

我除以amtid=1/sum(amt for all the ids)找到amt%id=1。 如何在sql中爲此編寫查詢?

回答

2
select id, amt, 100.0 * amt/(select sum(amt) from tab) as amt_percent 
from tab 

心靈100.0.0非常重要,它會「強制」轉換int s到float s。

新增後評論:

select t.id, t.amt, 100.0 * t.amt/p.s as amt_percent 
from tab t 
join (
    select id, sum(amt) as s 
    from tab 
    group by id 
) p on p.id = t.id 

和另一種方式:

select id, amt, 
    100.0 * amt/(
     select sum(amt) 
     from tab t1 
     where t1.id = t.id 
    ) as amt_percent 
from tab t 

我更喜歡加入子查詢 - 第一個。

+0

+1提出'.0' – triclosan 2012-02-24 12:51:40

+0

這個查詢是非常有用的,但多了一個疑問,其實我分組該表由id。在那種情況下如何寫? – ResKing 2012-02-24 12:58:48

+0

@ResKing然後它會看起來有點不同我添加了查詢來回答。 – 2012-02-24 13:03:35

1
select id, amt, 100*amt/(select NULLIF(sum(amt),0) from tbl) as "amt%" 
from tbl 

也許這樣

select t.id, t.amt, 100*amt/sm.s as "amt%" 
from tbl t, (select NULLIF(sum(amt),0) as s from tbl) sm 

編輯檢查由零

1

除以你可以嘗試這樣的事情:

SELECT 
    id, amt, 
    amt/(SELECT SUM(amt) FROM tabl) * 100 as amtperc 
FROM tabl 
0
select id, amt, 100 * amt/(case when (select sum(amt)as ss from tablename)>0 then 
(select sum(amt)as ss from tablename) else 1 end) as [amt%] from tablename 
1

假設你使用的是Oracle(在你前面的問題),請嘗試:

select id, amt, 100 * amt/sum(amt) over() amtperc 
from your_table 
+0

+1'SUM()OVER()'比子查詢更有效率(無論如何MS SQL Server是我的經驗所在) – GarethD 2012-02-24 15:07:02