0

% モードで結果を取得する SQL クエリを作成する際に問題に直面しています。SQL ServerSUM()COUNT()機能に慣れていますが、クエリ内にロジックを実装する際に問題に直面しています。

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

私のテーブル構造は次のようなもので、2 つの列Name(UserName) と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

3 に答える 3

4

テーブルに参加する必要はありません。SUM代わりに、次のように使用またはCOUNT機能できます。

使用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;

このSQLFiddleを参照してください

于 2012-08-30T10:58:19.900 に答える
0

いいえ、ありません。100 を掛けて、2 つの数値を明示的に除算する必要があります。

于 2012-08-30T10:56:16.760 に答える
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
于 2012-08-30T11:01:51.403 に答える