2012-10-12 77 views
2

不知道该怎么说。假设我有一个选择回应这个。TSQL正在运行的总计来自前面的总和

Name, month, amount 
John, June, 5 
John, July,6 
John, July, 3 
John August, 10 

我想汇总并报告每个月的开始报告。

姓名,月份,初始余额。

john, may, 0 
john, june, 0 
john, july, 5 
john, august, 14 
john, September, 24 

我可以在Excel单元格公式中做到这一点,但我怎么能在SQL中做到这一点,而不需要在任何地方存储值呢?我有另一个财政月表我可以做一个左外连接,所以所有的月份都被报告,只是不确定如何从以前的几个月在SQL中汇总。

+0

您使用的是什么rdbms? SQL服务器,MySQL? – Taryn

+0

对不起TSQL SQL Server。更新。 – o365spo

+2

哪个版本的SQL Server?这一点非常重要,因为2012年的功能不像2008年,而2008年的功能是2005年没有的功能。或者也许它的精简版?随着数据量的增长*(如答案中所述)*,您选择的半职业产品答案效率非常低。但要知道最好的选择需要知道你有什么选择;它涉及知道您实际使用的SQL Server版本。 – MatBailie

回答

2
select 
name 
, month 
, (select sum(balance) from mytable 
    where mytable.month < m.month and mytable.name = m.name) as starting_balance 
from mytable m 
group by name, month 

这并不像你一样窗口函数,但由于他们从数据库变化到数据库,你需要告诉我们您正在使用的系统。

这是一个内联子查询,它不是很高效。但至少很容易理解发生了什么!

+0

谢谢。需要测试一下。自第一次标记为答案。不想让这个问题复杂化,但是如果业务存在复杂性 - 例如,我想增加前一个月的百分比,那么这个百分比是由John在上个月的服务年限决定的。我可以在内嵌函数中做到这一点吗? – o365spo

+0

是的,你可以,但它很快就会变得难以阅读和缓慢(因为内联SQL针对每行执行*)。然后,我会在Sql Server中查看连接或RANK()和OVER()函数。有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/ms176102.aspx。 – davek

+0

这不是说这是一个内联函数,而是SQL Server在生成查询计划时非常擅长的。问题在于它是一种半自动产品。 *(每个后续行连接到所有前面的行,这意味着总共100行以上的行实际上处理1 + 2 + ... + 100行数据,总共5050行...)*更高版本的SQL服务器允许*(作为@davek状态)*使用OVER子句,可以显着提供此问题。 – MatBailie

0

使用分组这样

SELECT NAME, MONTH , SUM(Balance) FROM table GROUP BY NAME, MONTH 
+0

该OP需要*前几个月的数据总和 – davek

0

假设你的月份表示为日期,这会给你跑步总数。

select t1.name, t1.month, sum(t2.amount) 
from yourtable t1 
left join yourtable t2 
    on t1.name = t2.name 
    and t1.month>t2.month 
group by t1.name, t1.month