2013-06-10 3 views
1

Может ли кто-нибудь помочь мне получить кумулятивную сумму и процент. У меня есть три поля в таблице «способность»Совокупная сумма и процент

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% 

Пожалуйста, обратите внимание, что у меня есть около 3 млн строк и данные продолжают расти дня в день.

+0

В верхней части окна редактирования много кнопок. '{}' будет отступать на 4 пробела и пометить что-то вроде кода. – Ben

ответ

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 
+0

Большое спасибо Гордону за это, я получил эту работу, но основная проблема, которую я испытываю, - это упорядочить данные по возрастанию на основе TotalDefects, а не упорядочивать по вертикали. Любые предложения .. –

+0

@youbarajsharma. , , Добавьте предложение 'order by', например' order by TotalDefects' или 'order by TotalDefects desc'. –

0

Ok может быть, это поможет кто-то пытается получить аналогичный вывод. Вот что я сделал, чтобы получить желаемый результат. Большое спасибо гордон, ваше предложение действительно помогло мне сделать это возможным

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 
Смежные вопросы