2017-07-17 4 views
0

Ich muss YTD und letztes Jahr YTD auf einer Tabelle [SQL Server 2012] berechnen. Unten ist die Abfrage, die ich versucht habe. Es wird für einige Fälle verdoppelt und verdreifacht.SQL YTD und letztes Jahr YTD auf vollständige Daten

SELECT SUM(A.RevisionNumber)YTD,SUM(P.RevisionNumber)LY_YTD,B.OrderDateM,B.OrderDateY 
FROM 
    (select MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY from sales.SalesOrderHeader B 
    group by MONTH(OrderDate),YEAR(OrderDate))B 
LEFT JOIN 
    (select SUM(RevisionNumber)RevisionNumber,MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY 
    from sales.SalesOrderHeader 
    group by MONTH(OrderDate),YEAR(OrderDate))A 
ON A.OrderDateM<=B.OrderDateM AND A.OrderDateY=B.OrderDateY 
LEFT JOIN 
    (select SUM(RevisionNumber)RevisionNumber,MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY 
    from sales.SalesOrderHeader 
    group by MONTH(OrderDate),YEAR(OrderDate))P 
ON P.OrderDateM<=B.OrderDateM AND P.OrderDateY=B.OrderDateY-1 
GROUP BY B.OrderDateM,B.OrderDateY 
ORDER BY B.OrderDateY,B.OrderDateM 

enter image description here

+0

Hinzufügen von Beispieldaten als Bild wird Ihnen nicht helfen .. Niemand kann es verwenden, um die Abfragen zu testen. Fügen Sie Beispieldaten als Text im Tabellenformat hinzu. 68 Fragen mit 7 Jahren Zeit in SO sollten Sie das wissen. –

+2

Wenn die Werte genau doppelt und dreifach sind, dann ist es ein ziemlich gutes Zeichen, dass Ihre Abfrage mehrfach zurückgibt Zeilen für einige Ihrer Gruppierungen. Dies ist normalerweise ein Zeichen dafür, dass die Join-Prädikate nicht korrekt sind. Wir können unmöglich irgendwelche Details liefern, da Sie keine für uns bereitgestellt haben. Hier ist ein großartiger Ort, um anzufangen. https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+2

Der erste Join gibt * n * Zeilen für die * nth * Monate und zurück der 2. verbindet diese 'n' Monate mit anderen' n' Monaten, also richtig für Januar, zweimal für Februar, verdreifachen für März, etc. Schnelle & schmutzige Lösung: Dividiere 'LY_YTD' durch die Monatsnummer. Saubere Lösung: Schreibe auf zwei Selects (aktuelles & letztes Jahr) und äußere sie zusammen. – dnoeth

Antwort

2

können Sie Windowing-Funktion verwenden, wie unten:

;With cte as (
    Select Sum(RevisionNumber) As SM_RevisionNumber, Month(OrderDate) as OrderM, 
      Year(OrderDate) as OrderY 
      From Sales.SalesOrderHeader 
      Group by Month(OrderDate), Year(OrderDate) 
     ), cte2 as (
    Select YTD = Sum(SM_RevisionNumber) over (partition by OrderY order by OrderM), 
     OrderM, OrderY, RowN = Row_Number() over(order by OrderY, OrderM) 
     from cte 
    ) 
    Select YTD, LY_YTD = lag(YTD, 12, null) over(Order by RowN), OrderM, ORderY 
     from cte2 

Aber diese Lösung setzt voraus, wir atleast einen Eintrag für jeden Monat und Jahr.

Verwandte Themen