2017-02-09 4 views
3

Ich muss wöchentlich aggregierte Daten für den Vertrieb erstellen. Wobei TRNST_QTY die letzte verfügbare Menge der Schlusswoche ist und PRCHS_QTY die Summe der Kaufmenge für die jeweilige Woche ist. Ich habe eine Datumsdimension, in der der Datumsschlüssel und der entsprechende Wocheschlüssel vorhanden sind.Neueste Datensätze mit sql

Wenn es eine Woche ist, gibt es keine Transaktion passiert es die letzte Woche dauern sollte TRNST_QTY und PRCHS_QTY wird 0

Tabelle 1 (Sales Tabelle) sein:

DT_KEY  ITEM TRNST_QTY PRCHS_QTY 
20160515 4098 2    1 
20160516 4098 10    1 
20160601 4098 4    0 
20160603 4098 8    0 
20160611 4098 6    4 
20160616 4098 4    0 
20160622 4098 8    0 
20160623 4098 2    0 
20160714 4098 11    3 

Ausgang erforderlich (wöchentliches Aggregat):

Datum & Woche Mapping:

DT_KEY  WK_DT_KEY 
20160515 20160521 
20160516 20160521 
20160517 20160521 
20160518 20160521 
20160519 20160521 
20160520 20160521 
20160521 20160521 
20160601 20160607 
20160602 20160607 
20160603 20160607 
20160604 20160607 

und so weiter

Bisher ich in der Lage bin zu folgenden Abfrage aber es ist nur letzte Woche Informationen

select * from 
(
SELECT WK_DT_KEY 
    ,ITEM 
    ,sum(PRCHS_QTY) OVER (
     PARTITION BY WK_DT_KEY 
     ,ITEM 
     ORDER BY WK_DT_KEY 
      ,ITEM 
     ) AS PRCHS_QTY 
    ,ROW_NUMBER() OVER (
     PARTITION BY ITEM order by a.dt_key desc 
     ) AS RNK 
FROM fct_itm a 
    ,DIM_DT DIM_DT 
WHERE a.dt_key <= '20170207' 
    AND DIM_DT.DT_key = a.dt_key 
) 
where RNK = 1; 

Ich will geben zu Vermeiden Sie den prozeduralen Ansatz oder die connect by-Klausel Ich werde jede Hilfe dankbar sein.

Antwort

0
SELECT DIM_DT.WK_DT_KEY, 
     A.ITEM, 
     SUM(A.PRCHS_QTY) OVER (PARTITION BY DIM_DT.WK_DT_KEY,A.ITEM) AS PRCHS_QTY, 
     FIRST_VALUE(A.TRNST_QTY) OVER (PARTITION BY A.ITEM,DIM_DT.WK_DT_KEY 
             ORDER BY A.DT_KEY DESC) AS TRNS_QTY 
FROM FCT_ITM A 
JOIN DIM_DT DIM_DT ON DIM_DT.DT_KEY = A.DT_KEY 
WHERE A.DT_KEY <= '20170207' 

Hinweise:

  • Verwenden Sie die FIRST_VALUE Funktion die neueste trnst_qty für jede Woche.

  • ORDER BY ist in der SUM nicht erforderlich, da Sie die Summe und nicht die Gesamtanzahl erhalten.

  • Verwenden Sie immer die explizite join Syntax anstelle von , s in der where Klausel.
  • Verwenden Sie geeignete Aliase vor den Spaltennamen.

Edit: Per OP Kommentar, den letzten Nicht-Null-Wert für Wochen fehlender Transaktionen zu erhalten, verwenden Sie LAG mit IGNORE NULLS Option.

SELECT 
WK_DT_KEY, 
ITEM, 
CASE WHEN TRNS_QTY IS NULL THEN LAG(TRNS_QTY IGNORE NULLS) OVER(PARTITITON BY ITEM ORDER BY WK_DT_KEY) 
ELSE TRNS_QTY END AS TRNS_QTY, 
PRCHS_QTY 
FROM 
(SELECT DISTINCT D.WK_DT_KEY, 
    D.ITEM, 
    SUM(COALESCE(A.PRCHS_QTY,0)) OVER (PARTITION BY D.WK_DT_KEY,D.ITEM) AS PRCHS_QTY, 
    FIRST_VALUE(A.TRNST_QTY) OVER (PARTITION BY D.ITEM,D.WK_DT_KEY 
                ORDER BY A.DT_KEY DESC) AS TRNS_QTY 
    FROM 
    (SELECT DT.WK_DT_KEY,DT.DT_KEY,F.ITEM 
    FROM DIM_DT DT 
    CROSS JOIN (SELECT DISTINCT ITEM FROM FCT_ITM) F) D --cross join items with all dates and week combinations 
    LEFT JOIN FCT_ITM A ON D.DT_KEY = A.DT_KEY AND D.ITEM=A.ITEM 
    AND A.DT_KEY <= '20170207' 
) X 
+0

Um die vkp-Notizen hinzuzufügen: Verwenden Sie DATE Datentypen !!! – BobC

+0

@vkp Danke! . Es gibt einige Wochen, in denen ich keine Transaktion habe. Ich muss auch die Daten für diese Woche bekommen. Zum Beispiel '20160707' Woche dosent jede Transaktion so sollte es die trnst_qty aus '20160630' Woche und 'PRCHS_QTY' ist Null. – luminita

+0

Was passiert, wenn 2 oder mehr Wochen keine Werte vorhanden sind? Sollten die Werte aus der letzten verfügbaren Woche abgerufen werden? –

Verwandte Themen