2010-11-08 12 views
3

Je travaille sur une procédure stockée. J'ai une table appelée #CashFlow qui contient des données pour une période de temps.SQL somme() sur différentes périodes?

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 

J'ai aussi une table appelée #Funds qui contient une liste des identifiants de fonds de que je suis intéressé. (Il y a un tas de traitement que je vous attarderons pas qui génère cette liste de fonds pour moi) Par exemple, disons simplement que ma table #Funds n'a que les ID 1 et 2 (3 sont exclus).

J'ai trois périodes (toutes se terminant '31/08/2010') à partir du 1/1/2004, 1/1/2006, et 1/1/2010 et je voudrais agréger la somme sur les trois périodes.

J'ai essayé quelque chose comme ceci:

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' 

Mais il ne fait pas ce que je veux (en fait, je ne peux pas comprendre exactement ce qu'il fait). Si je ne sélectionne qu'une seule période, j'obtiens les bonnes valeurs pour la période, mais à la seconde, j'ajoute une des jointures, mes nombres sont tous gagnés.

Ceci est quelque chose comme la requête initiale que je suis en train de remplacer:

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' 

Notez que mes dates sont en fait des variables (qui ne devrait pas d'importance pour cela) et ma requête originale

Répondre

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

Est-ce que "cas quand .... alors Quantité additionnelle 0 fin" sera plus correct? – Badiboy

+0

@Badiboy: L'expression 'CASE' retournera' NULL' pour les dates hors période, que 'SUM' ignorera. "0" ne fait aucune différence. – Quassnoi

+0

je ne sais pas comment je n'ai pas pensé à ça ... beaucoup d'amour – pinkfloydx33

2

groupe utilisation par:

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

Ce qui est 'period'? – Quassnoi