2010-11-08 28 views
3

我正在处理存储过程。我有一个名为#CashFlow的表,其中包含一段时间的数据。不同时期的SQL sum()?

FundID TradeDate Amount 
1  1/1/2004 123.00 
1  6/30/2006 100.00 
2  1/1/2004 100.00 
2  3/15/2010 150.00 
3  1/1/2010 100.00 

我也有一个名为#Funds表,包含基金的ID,我很感兴趣的列表。(有一堆,我不会与你承担的处理产生的这个名单基金对我来说)例如,我们只是说我的#Funds表中只有ID的1和2(不包括3)。

我有三个时间段(所有结束'8/31/2010')开始于2004年1月1日,1/1/2006和2010年1月1日,我想汇总三个时期。

我已经试过这样的事情:

select sum(c1.amount), sum(c2.amount), sum(c3.amount) 
from 
    #fundtable f 
inner join 
    #cashflow c1 on f.fundid = c1.fundid and c1.tradedate between '1/1/2004' and '8/31/2010' 
inner join 
    #cashflow c2 on f.fundid = c2.fundid and c2.tradedate between '1/1/2006' and '8/31/2010' 
inner join 
    #cashflow c3 on f.fundid = c3.fundid and c3.tradedate between '1/1/2010' and '8/31/2010' 

但它不这样做我想要的(其实我也弄不清到底是做)什么。如果我只选择一个期间,我会为期间获得正确的值,但是第二个我添加一个连接,我的数字将全部消失。

这是类似的东西我试图取代原有的查询:

select 
    (select sum(Amount) from #Cashflow c inner join #fundtable f on c.fundid = f.fundid where tradedate between '1/1/2004' and '8/31/2010') as 'Period1', 
    (select sum(Amount) from #Cashflow c inner join #fundtable f on c.fundid = f.fundid where tradedate between '1/1/2006' and '8/31/2010') as 'Period2', 
    (select sum(Amount) from #Cashflow c inner join #fundtable f on c.fundid = f.fundid where tradedate between '1/1/2010' and '8/31/2010') as 'Period3' 

请注意,我的日期,实际上是变量(这不应该为这件事),我的原始查询

回答

5
SELECT SUM(CASE WHEN TradeDate BETWEEN '2004-01-01' AND '2010-08-31' THEN Amount END), 
     SUM(CASE WHEN TradeDate BETWEEN '2006-01-01' AND '2010-08-31' THEN Amount END), 
     SUM(CASE WHEN TradeDate BETWEEN '2010-01-01' AND '2010-08-31' THEN Amount END) 
FROM Funds 
JOIN Cashflow 
ON  Cashflow.id = Funds.id 
+1

请问“......时候的情况下,其他的0结束”更准确吗? – Badiboy 2010-11-08 13:49:13

+0

@Badiboy:'CASE'表达式将返回'NULL'作为日期之外的日期,SUM将忽略这个日期。 '0'没有区别。 – Quassnoi 2010-11-08 13:56:13

+0

我不知道我怎么没有想到...很多爱 – pinkfloydx33 2010-11-08 14:02:43

2

使用GROUP BY:

select period, sum(money) from table group by period 
+0

什么是'period'? – Quassnoi 2010-11-08 13:56:38