2017-01-18 108 views
0

我想編寫一個報告,將產生4組銷售數據:每天,每月,每季度和每年。我遇到的問題是如果沒有日常活動,它不會產生每月,每季度或每年。我怎麼能得到沒有數據的日子來產生一個0,並仍然計算其他三組?下面是我想使用(它沒有列入當年爲一組尚未)代碼:生成銷售數據通過每日,每月,每季度,每年與組

WITH Summary AS 
(SELECT 
    1 as GRP, 
    'DAILY' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 

UNION 

SELECT 
    2 as GRP, 
    'MTD' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.MTDDollarsBilled) = 0 THEN 0 ELSE (SUM(O.MTDDollarsBilled)) END, 
    BILLEDMSF = CASE WHEN SUM(O.MTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.MTDMsfBilled)) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.MTDDollarsBilled)/SUM(O.MTDMsfBilled)) END, 
    SUM(O.MTDContribution) as BilledContribution, 
    SUM(O.MTDProfit) as BilledProfit 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 

UNION 

SELECT 
    3 as GRP, 
    'QTD' as Label, 
    O.SnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.QTDDollarsBilled) = 0 THEN 0 ELSE (SUM(O.QTDDollarsBilled)) END, 
    BILLEDMSF = CASE WHEN SUM(O.QTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.QTDMsfBilled)) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.QTDMsfBilled) = 0 THEN 0 ELSE (SUM(O.QTDDollarsBilled)/SUM(O.QTDMsfBilled)) END, 
    SUM(O.QTDContribution) as BilledContribution, 
    SUM(O.QTDProfit) as BilledProfit 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 
GROUP BY 
    O.SnapshotDateKey 
) 

SELECT * FROM Summary 
UNION ALL SELECT NULL, 0,0,0,0,0 WHERE NOT EXISTS (SELECT * FROM Summary) 

謝謝!

+1

請分貝平臺標記。 – OldProgrammer

+0

謝謝。我已經這樣做了。 –

+0

你的平臺是mysql&sql-server在同一時間嗎? – McNets

回答

0

考慮更改WHERE子句聯合查詢點的所有部分苛求可能/可能不包含數據單日期。此外,重複的日常聚集的所有部分,因爲更新WHERE條件將擴大的行數。無需維護MTD,QTD或YTD列。加上無需GROUP BY的所有列可與GRP標籤常數聚集。

由於SnapshotDateKey似乎捕獲日期爲數字,簡單地篩選適當的範圍內對非日常週期。下面是一個更新CTE聲明:

WITH Summary AS 

(SELECT 
    1 as GRP, 
    'DAILY' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey = 20161230 and O.SalesRepKey = 167 

UNION 

SELECT 
    2 as GRP, 
    'MTD' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey BETWEEN 20161201 AND 20161230 and O.SalesRepKey = 167 

UNION 

SELECT 
    3 as GRP, 
    'QTD' as Label, 
    MAX(O.SnapshotDateKey) AS MaxSnapshotDateKey, 
    BilledDollars = CASE WHEN SUM(O.DollarsBilled) = 0 THEN 0 ELSE SUM(O.DollarsBilled) END, 
    BilledMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE SUM(O.MsfBilled) END, 
    BookedDollarsPerMSF = CASE WHEN SUM(O.MsfBilled) = 0 THEN 0 ELSE (SUM(O.DollarsBilled)/SUM(O.MsfBilled)) END, 
    BilledContribution = CASE WHEN SUM(O.Contribution) = 0 THEN 0 ELSE SUM(O.Contribution) END, 
    BilledProfit = CASE WHEN SUM(O.Profit) = 0 THEN 0 ELSE SUM(O.Profit) END 
FROM 
    FactInvoiceSummary O 
WHERE 
    O.SnapshotDateKey BETWEEN 20161001 AND 20161230 and O.SalesRepKey = 167 
) 

除了 - 在理想情況下,你可以使用一個日期時間字段,維持日期/時間的部分,提取天/周/月/季度/年的指標。同樣如上所示,僅合計一個一套DollarsBilled,MsfBilled,Contribution,Profit列,沒有MTD,QTD,YTD的計算集。