2012-08-30 28 views
0

我面臨一個問題,寫一個SQL查詢以獲得結果在%模式下,我很熟悉SUM()COUNT() SQL Server的功能,但面臨問題來實現邏輯內查詢我想導致以下表格: -是否有任何內置函數來計算在SQL Server中的百分比

UserName--- % of AccepectResult---- % of RejectResult 

我的表結構是這樣的有兩列Name(用戶名)和Result

NAME  Result 
--------------- 
USer1  A 
USer1  A 
USer1  A 
USer1  R 
USer1  R 
USer1  A 
USer2  A 
USer2  A 
USer2  A 
USer2  A 
USer2  R 

A - Accepted Result 
R - Rejected Result 

我想寫這個查詢像這樣..

select * into #t1 from 
(
    select UserName , count(Result) as Acc 
    from Test where result = 'A' 
    group by UserName 
) as tab1 

select * into #t2 from 
(
    select UserName , count(Result) as Rej 
    from Test where result = 'R' 
    group by UserName 
) as tab2 

select #t1.UserName , 
     #t1.Acc , 
     #t2.Rej , 
    (#t1.Acc)*100/(#t1.Acc + #t2.Rej) as AccPercentage, 
    (#t2.Rej)*100/(#t1.Acc + #t2.Rej) as RejPercentage 

from #t1 
inner join #t2 on #t1.UserName = #t2.UserName 


drop table #t1 

drop table #t2 

是否有任何其他方式來編寫此查詢和任何內置函數來計算SQL Server中的百分比?

回答

4

你不需要連接表。相反,你可以使用SUMCOUNT功能是這樣的:

使用SUM功能:

SELECT Name, 100 * 
SUM(CASE WHEN Result = 'A' THEN 1 ELSE 0 END)/COUNT(result) 
AS Accept_percent 
,100 * 
SUM(CASE WHEN Result = 'R' THEN 1 ELSE 0 END)/COUNT(result) 
AS Reject_percent 
FROM t 
Group by Name; 

或者使用COUNT功能:

SELECT Name, 100 * 
COUNT(CASE WHEN Result = 'A' THEN 1 ELSE NULL END)/COUNT(result) 
AS Accept_percent 
,100 * 
COUNT(CASE WHEN Result = 'R' THEN 1 ELSE NULL END)/COUNT(result) 
AS Reject_percent 
FROM t 
Group by Name; 

或者使用SubQuery

SELECT Name, 100 * 
(SELECT COUNT(result) FROM t WHERE result='A' And Name = main.Name)/COUNT(result) 
AS Accept_percent 
, 100 * 
(SELECT COUNT(result) FROM t WHERE result='R' And Name = main.Name)/COUNT(result) 
AS Reject_percent 
FROM t main 
Group by Name; 

See this SQLFiddle

0

不,沒有。你將不得不乘以100並明確地劃分你的兩個數字。

0

嘗試這樣:

select username, (100 * sum(case result when 'A' then 1 else 0 end)/count(*)) as accepted, 
       (100 * sum(case result when 'R' then 1 else 0 end)/count(*)) as rejected 
    from test 
    group by username