Сумма SQL () за разные периоды? - PullRequest
3 голосов
/ 08 ноября 2010

Я работаю над хранимой процедурой.У меня есть таблица с именем #CashFlow, которая содержит данные за промежуток времени.

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, в которой содержится список идентификаторов фондов, в которых я заинтересован.список фондов для меня) Например, давайте просто скажем, что в моей таблице #Funds есть только идентификаторы 1 и 2 (3 исключено).

У меня есть три периода времени (все заканчивающиеся '8/31 /2010 '), начиная с 01.01.2004, 01.01.2006 и 01.01.2010, и я хотел бы объединить сумму за три периода.

Я пробовал что-то подобное:

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'

Но он не делает то, что я хочу (на самом деле я не могу понять, что именно он делает).Если я выберу только один период, я действительно получу правильные значения для этого периода, но после того, как я добавлю одно из объединений, мои номера будут сбиты с ног.

Это что-то вроде исходного запроса,m пытается заменить:

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'

Обратите внимание, что мои даты на самом деле являются переменными (что не должно иметь значения для этого), и мой оригинальный запрос

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010
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
2 голосов
/ 08 ноября 2010

Использовать группу по:

select period, sum(money) from table group by period
...