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;