2014-02-14 11 views
5

Ich habe gerade erst begonnen, in SQL zu suchen.SQL Sum MTD & YTD

Ich habe eine SQL Server 2008 R2-Datenbank, die zwei Felder DocDate & InvValue zurückgibt. Ich brauche die InvValues ​​als MTD & YTD wie vom heutigen Tag zusammenzufassen So ist es wie

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

sieht ich eine ganze Menge googeln getan haben und kann eine oder das andere mit SUM & DATEPART tun, aber ich bin fest mit versuchen, beides zu tun.

Kann jemand mir einen Pseudo-Code geben, der mir helfen würde, ein wenig weiter zu googeln.

Vielen Dank @Gordon Linoff, Das hat sehr geholfen und ich habe etwas gelernt, dass ich in der Zukunft nützlich finden werde. Mein Code sieht jetzt aus wie:

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] 

aber jetzt ich

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

bekommen Und ich brauche

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

weitere Hilfe würde geschätzt.

Antwort

1
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') ; 

Die (komplizierten) Bedingungen an den WHERE Klauseln verwendet werden anstelle des YEAR(column) = YEAR(GETDATE() und das andere, das Sie vorher hatten, also können Indizes benutzt werden. Wenn Sie eine Funktion auf eine Spalte anwenden, machen Sie Indizes unbrauchbar (mit einigen geringfügigen Ausnahmen für einige Funktionen und einige Veri von SQL-Server.) Versuchen Sie also, die Bedingungen in diesen Typ zu konvertieren:

column <operator> AnyComplexFunction() 
+0

Danke @ypercube. Kannst du mehr über die Where-Klausel erklären? Ich bin ein bisschen verwirrt. – user2694771

3

Sie können dies mit bedingter Aggregation:

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; 

Dies setzt voraus, Sie haben keine zukünftigen Termine in der Tabelle. Wenn Sie dies tun, fügen Sie beiden Klauseln docdate < getdate() hinzu.

EDIT:

Wenn Sie diese in zwei Reihen benötigen, können Sie einfach tun:

select (case when n.n = 1 then 'YTD' else 'MTD' end) as which, 
     (case when n.n = 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; 
+0

Danke dir. Zusätzliche Informationen zu meiner Anfrage hinzugefügt. – user2694771