【问题标题】:Is there any built-in function to calculate percentage in SQL Server是否有任何内置函数来计算 SQL Server 中的百分比
【发布时间】:2012-08-30 19:22:38
【问题描述】:

我在编写 SQL 查询以在 % 模式下获取结果时遇到问题,我熟悉 SQL Server 的 SUM()COUNT() 函数,但在查询内部实现逻辑时遇到问题我希望得到以下形式的结果: -

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

我的表结构是这样的,有两列 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 中计算百分比的任何内置函数?

【问题讨论】:

    标签: sql sql-server percentage


    【解决方案1】:

    您不需要加入表格。相反,您可以像这样使用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

    【讨论】:

      【解决方案2】:

      不,没有。您必须乘以 100 并明确除以两个数字。

      【讨论】:

        【解决方案3】:

        试试这样的:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-11
          • 1970-01-01
          相关资源
          最近更新 更多