如何增加行SQL中的总和/计数

时间:2015-04-27 22:10:15

标签: sql sql-server sum

我无法计算TotalAmount递增数,但是每行迭代的策略数量会增加很多。

例如,请考虑以下代码:

SELECT 
  Customer.custno, 
  Customer.enteredDate AS 'Date Entered', 
  COUNT(BasicPolInfo.polid) AS 'Number of Policies', 
  SUM( COUNT(BasicPolInfo.polid)) over() AS TotalAmount    
FROM Customer 
INNER JOIN BasicPolInfo ON Customer.custid = BasicPolInfo.custid    
WHERE BasicPolInfo.polid IS NOT NULL 
  and Customer.firstname IS NOT NULL 
  AND Customer.enteredDate > '1/1/79'    
GROUP BY Customer.custno, Customer.firstname, Customer.lastname, Customer.entereddate    
ORDER BY Customer.enteredDate ASC

我希望看到的是从循环每个客户的政策数量中添加TotalAmount列。

例如:

21 -- date -- 6 -- 6
24 -- date -- 13 -- 19
25 -- date -- 23 -- 32
29 -- date -- 16 -- 48

我可能不太关心白痴的顺序,相反,如果总政策甚至是159703,我更关心?此SQL中有超过1000行。

请帮助我如何从前一笔总和中加总每一行!

2 个答案:

答案 0 :(得分:1)

在SQL Server 2012转发中,您可以在分析/窗口函数中使用ROWS来获取正在运行的聚合:

SELECT  Customer.custno
      , Customer.enteredDate AS 'Date Entered'
      , COUNT(BasicPolInfo.polid) AS 'Number of Policies'
      , SUM(COUNT(BasicPolInfo.polid)) OVER (ORDER BY Customer.custno ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS TotalAmount
FROM    Customer
        INNER JOIN BasicPolInfo ON Customer.custid = BasicPolInfo.custid
WHERE   BasicPolInfo.polid IS NOT NULL
        AND Customer.firstname IS NOT NULL
        AND Customer.enteredDate > '1/1/79'
GROUP BY Customer.custno
      , Customer.firstname
      , Customer.lastname
      , Customer.entereddate
ORDER BY Customer.enteredDate ASC

请注意,虽然您不关心订单,但需要ORDER BY才能确定当前行之前的哪些行。

答案 1 :(得分:0)

看来你正在寻找累计总数。

这可以通过CTE来完成,通过使用"在无限制的预先行和当前行之间行驶来加入表格本身,子查询或截至2012年。在聚合窗口函数中。

这可以使用任何聚合窗口函数来完成。你需要使用

 OVER (ORDER BY ______ ORDER BY  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

*请注意,您需要使用order by来指定列的排列。

下面链接到另一个堆栈溢出问题提供了一些明显的例子。

how to get cumulative sum