2017-02-09 36 views
3

我需要爲銷售創建每週彙總數據。其中TRNST_QTY是最後一週的最新可用數量,PRCHS_QTY是特定一週的購買數量的總和。我有日期維度,日期鍵和相應的星期鍵存在。使用sql的最新記錄

如果有任何一週沒有交易發生,應該採取上週TRNST_QTYPRCHS_QTY0

表1(Sales表):

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 

輸出要求(每週總計):

WK_DT_KEY ITEM TRNST_QTY PRCHS_QTY 
20160521 4098 10   2 
20160607 4098 8   0 
20160614 4098 6   4 
20160621 4098 4   0 
20160630 4098 2   0 
20160707 4098 2   0 
20160714 4098 11   3 

日期&周映射:

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 

到目前爲止,我能夠在下面的查詢,但其只給最近一週的信息

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; 

我想避免程序方法或通過條款連接。 我將不勝感激任何幫助。

回答

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' 

注:

  • 使用FIRST_VALUE函數來獲取每週最新trnst_qty。

  • SUM不需要ORDER BY,因爲您得到的是總數,而不是總數。

  • 總是在where子句中使用明確的join語法而不是,
  • 在列名之前使用適當的別名。

編輯:每個操作的評論,得到了幾個星期缺少交易的最後一個非空值,使用LAGIGNORE NULLS選項。

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

添加vkp的註釋:使用DATE數據類型!!! – BobC

+0

@vkp謝謝! 。有幾個星期我沒有交易。我也需要得到那一週的數據。例如,「20160707」周內的任何交易都將進行任何交易,因此應從「20160630」周開始選擇trnst_qty,而「PRCHS_QTY」爲零。 – luminita

+0

如果有兩週或更長時間缺失值,該怎麼辦?是否應該從最近的可用一週中提取這些值? –