SQL Sum MTD et YTD

Je viens juste de commencer à chercher dans SQL.

J'ai une database SQL Server 2008 r2 qui returnnera deux champs DocDate & InvValue. Je dois additionner les InvValues ​​en MTD et en YTD à la date d'aujourd'hui.

**Period** /////// **Total value** MTD ////////////111111.11 YTD /////////////999999.99 

J'ai fait un bon nombre de googling et peut faire l'un ou l'autre avec SUM et DATEPART, mais je suis coincé avec essayant de faire les deux.

Quelqu'un peut-il me donner un pseudo-code qui m'aiderait à google un peu plus loin.

Merci @Gordon Linoff, Cela m'a beaucoup aidé et j'ai appris quelque chose, que je findai utile dans le futur. Mon code ressemble maintenant à:

 SELECT SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) THEN T0.[TotalSumSy] END) AS YTD, SUM(CASE WHEN YEAR(T1.[DocDate]) = YEAR(GETDATE()) AND MONTH(T1.[DocDate]) = MONTH(GETDATE()) THEN T0.[TotalSumSy] END) AS MTD FROM [dbo].[INV1] T0 INNER JOIN [dbo].[OINV] T1 ON T1.[DocEntry] = T0.[DocEntry] 

Cependant, je reçois maintenant

 YTD.........MTD 99999.99....111111.11 

Et j'ai besoin

 YTD........99999.99 MTD........11111.11 

Toute aide supplémentaire serait appréciée.

 SELECT Period = 'MTD', Total_value = SUM(T0.TotalSumSy) FROM dbo.INV1 T0 INNER JOIN dbo.OINV T1 ON T1.DocEntry = T0.DocEntry WHERE T1.DocDate >= DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'20010101') AND T1.DocDate < DATEADD(month,1+DATEDIFF(month,'20010101',GETDATE()),'20010101') UNION ALL SELECT 'YTD', SUM(T0.TotalSumSy) FROM dbo.INV1 T0 INNER JOIN dbo.OINV T1 ON T1.DocEntry = T0.DocEntry WHERE T1.DocDate >= DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20010101') AND T1.DocDate < DATEADD(year,1+DATEDIFF(year,'20010101',GETDATE()),'20010101') ; 

Les conditions (compliquées) des clauses WHERE sont utilisées à la place de YEAR(column) = YEAR(GETDATE() et l'autre que vous aviez précédemment, donc les index peuvent être utilisés.) WHen vous appliquez une fonction à une colonne, vous rendez les index impossibles (avec quelques exceptions mineures pour certaines fonctions et certains verios de SQL-Server.) Donc, le mieux est d'essayer de convertir les conditions à ce type:

 column <operator> AnyComplexFunction() 

Vous pouvez le faire avec l'agrégation conditionnelle:

 select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD, sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate()) then InvValue end) as MTD from table t; 

Cela suppose que vous n'avez aucune date future dans le tableau. Si c'est le cas, ajoutez docdate < getdate() aux deux clauses.

MODIFIER:

Si vous avez besoin de cela en deux lignes, vous pouvez simplement faire ceci:

 select (case when nn = 1 then 'YTD' else 'MTD' end) as which, (case when nn = 1 then YTD else MTD end) as value from (select sum(case when year(docdate) = year(getdate()) then InvValue end) as YTD, sum(case when year(docdate) = year(getdate()) and month(docdate) = month(getdaate()) then InvValue end) as MTD from table t ) cross join (select 1 as n union all select 2) n;