累积总和和百分比

时间:2013-06-10 18:09:54

标签: sql sql-server sql-server-2008-r2

有人可以帮助我获得累计金额和百分比。我在“功能”表中有三个字段

vertical|Defects(F)|Defects(NF)|

Billing | 193      |678
Provi   |200       |906
Billing |232       |111
Analyt  |67        |0
Provi   |121       |690

我希望最终输出为

Vertical|Total Defects|Cumulative Defects|Cumulative%

Billing |1214         | 1214             |37.96%
Provi   |1917         | 3131             |97.90%
Analyt  |67           | 3198             |100.00%

请注意,我有大约300万行,而且数据日复一日地增加。

2 个答案:

答案 0 :(得分:0)

我发现获取累积总和的最简单方法是使用相关子查询 - 除非您具有SQL Server 2012中窗口函数的全部功能

然而,这带来了一些挑战。首先,您需要按垂直方式进行总结。然后,您需要按正确的顺序订购垂直线。最后,您需要以您希望的方式输出结果:

这应该接近你想要的:

with d as
      (select vertical, sum(Defects_N + Defects_NF) as Defects,
              (case when vertical = 'Billing' then 1
                    when vertical = 'Provi' then 2
                    else 3
               end) as num
       from t
       group by vertical
      )
select vertical, defects as TotalDefects, cumDefects,
       100 * cast(cumDefects as float) / fulldefects as DefectPercent
from (select d.*,
             (select sum(defects) from d d2 where d2.num <= d.num
             ) as cumdefects,
             SUM(defects) over () as fulldefects
      from d
     ) d

答案 1 :(得分:0)

好的可能会有人试图获得类似的输出。以下是我为获得所需输出所做的工作。非常感谢戈登,你的建议实际上帮助我实现了这个目标

with d as
      (SELECT ROW_NUMBER () OVER  
(ORDER BY SUM([DEFECTS(F)]+[DEFECTS(NF)]) asc) NUM,
VERTICAL,
SUM([DEFECTS(F)]+[DEFECTS(NF)]) AS [DEFECTS]
 FROM Capability
GROUP BY VERTICAL

      )
select left(vertical,5) as Vertical, defects as TotalDefects, cumDefects,
       cast(cumDefects as float) / fulldefects as DefectPercent
from (select d.*,
             (select sum(defects) from d d2 where d2.num <= d.num
             ) as cumdefects,
             SUM(defects) over () as fulldefects
      from d

     ) d
相关问题