2017-10-04 3 views
2

Unten ist meine Abfrage. Kurz gesagt, meine Daten sind Jahr-zu-Datum-Zahlen, so dass die Abfrage die Monat-für-Datum-Bewegung ausrechnet, indem der aktuelle Monat und minus der Monat-1 abgerufen wird.SQL - MTD-Nummern von YTD, fehlende Nummern

Es funktioniert gut, wenn der aktuelle Monat alle Kombinationen des Vormonats enthält. Aber in diesem Monat war eine der Combos Null - daher YTD = 0 und es gibt keine Aufzeichnung für September.

Aber der Datensatz existiert noch im August, also sollte es mir eine Bewegung geben, dh August zeigt 100 und Sep zeigt nichts an. so sollte Bewegung 0-100 = -100 sein.

Ich weiß nicht, wie man die Abfrage anpasst, ich muss angeben, welchen Monat ich zuerst brauche, wo curr.month = 9, aber da die Kombination im September nicht existiert, funktioniert meine Verknüpfung nicht auch Gut. Bitte helfen Sie. Es verwendet die Sep-Daten als Basis, wo es sowohl Aug- als auch Sep-Kombinationen verwenden sollte.

SELECT curr.[Month], 
    curr.[GRCARef], 
    curr.[IEItem], 
    curr.currYTD, 
    prev.prevYTD, 
    CASE curr.[Month] 
    When 1 then currYTD 
    ELSE 
    cast((currYTD - COALESCE(prevYTD,0)) as numeric(15,2)) 
    END as MTD 

FROM 

    (SELECT [Month], 
      [GRCARef], 
      [Ac Code] IEItem, 
      sum([BalLCY]) currYTD 
    FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear] 
    Group by [Month], [Bch], [GRCARef],[Ac Code], [ProdType],[GHO] 
    ) curr 

    Full Outer JOIN 

    (SELECT [Month], 
      [GRCARef], 
      [Ac Code] IEItem, 
      sum([BalLCY]) prevYTD 
    FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear] 
    Group by [Month], [Bch], [GRCARef], [Ac Code], [ProdType],[GHO] 
    ) prev 

    ON curr.[GRCARef] = prev.[GRCARef] 
    and curr.[IEItem] = prev.[IEItem] 
    and curr.[Month] - 1 = prev.[Month] 
     -- Join with Month -1 

where 
curr.[MONTH] = 9 
+0

haben Sie gelöst? Haben Sie irgendeine Antwort für nützlich befunden? – MtwStark

Antwort

0

Sie benötigen Existenz von Monaten zu zwingen und dann Zusammenfassung beitreten:

;with 
m as (
    -- get numbers from 1 to 12 
    select top 12 ROW_NUMBER() over (order by id) [Month] 
    from sysobjects 
), 
g as (
    SELECT [Month], [GRCARef], [Ac Code] IEItem, sum([BalLCY]) YTD 
    FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear] 
    Group by [Month], [Bch], [GRCARef], [Ac Code], [ProdType], [GHO] 
) 
select 
    m.[Month], 
    ISNULL(curr.GRCARef, prev.GRCARef) GRCARef, 
    ISNULL(curr.IEItem, prev.IEItem) IEItem, 
    ISNULL(curr.YTD, 0) currYTD, ISNULL(prev.YTD, 0) prevYTD, 
    ISNULL(curr.YTD, 0) - ISNULL(prev.YTD, 0) MTD 
from m 
left join g curr on m.[Month] = curr.[Month] 
left join g prev on m.[Month] = prev.[Month] + 1 
where 
    m.[Month] = 9 

achten Sie [Bch], [ProdType], [GHO] in Ihrer Gruppe durch das sollte nicht da sein .. wenn sie ‚irrelevant‘ sind einfach entfernen Sie sie, wenn sie relevant sind, können Sie sie in select-Klausel setzen sollte und auch in Joinbedingung

EDIT: wenn Sie mit SQL Server arbeiten 2012 und über Sie auch verwenden können, LAG Funktion, um die Zusammenfassung des vorherigen Monats zu erhalten:

;with 
m as (
    -- get numbers from 1 to 12 
    select top 12 ROW_NUMBER() over (order by id) [Month] 
    from sysobjects 
), 
g as (
    SELECT [Month], [GRCARef], [Ac Code] IEItem, sum([BalLCY]) YTD 
    FROM [PWC_2017Q2].[dbo].[SS620_PL_FullYear] 
    Group by [Month], [Bch], [GRCARef], [Ac Code], [ProdType], [GHO] 
) 
f as (
select 
    m.[Month], GRCARef, IEItem, ISNULL(YTD, 0) currYTD, ISNULL(LAG(YTD, 1, 0) over (order by m.[Month]), 0) as prevYTD 
from m 
left join g curr on m.[Month] = curr.[Month] 
) 
select *, currYTD-prevYTD MTD 
from f 
where 
    [Month] = 9 
order by [Month] 
+1

Ich hatte nur eine Chance, es heute zu sehen. Ich bekomme wiederholt Werte auf curr.YTD. Ich habe auch eine Frage, wie die Abfrage funktioniert, was vorh. [Monat] ist? – gemmo

+1

Ich habe Ihre "Force Existence" -Technik verwendet und es hat funktioniert. Ich habe eine dritte Tabelle mit allen Kombinationen von Spalten erstellt, die ich brauche (unabhängig vom Monat). Dies ist eine vollständige Liste, ob sie im aktuellen Monat existiert oder nicht. – gemmo

+0

Entschuldigung, ich habe die -1 für vorige [Monat] vergessen, der Schlüssel der Abfrage ist Tabelle m (die Liste der Zahlen 1-12), es stellt sicher, dass eine Zeile für jeden Monat vorhanden ist, dann können Sie LINKS der SUMME beitreten (YTD) für den aktuellen und vorherigen Monat. Wenn Daten vorhanden sind, werden sie angezeigt, andernfalls erhalten Sie einen NULL – MtwStark

0

Versuchen Sie es.

cast((ISNULL(currYTD,0) - COALESCE(prevYTD,0)) as numeric(15,2))