2017-01-18 25 views
0

私は、売上データの4つのグループを生成するレポートをコード化しようとしています:毎日、毎月、四半期、私が実行している問題は、毎日の活動がない場合、毎月、四半期、または毎年生成されないということです。データを持たない曜日に0を生成し、他の3つのグループを計算するにはどうすればよいですか?ここで私が使用しようとしていますコードは(それが今年はまだグループとして含まれていない)である:毎日、毎月、四半期、および毎年のグループによる売上データの生成

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

DBプラットフォームでタグ付けしてください。 – OldProgrammer

+0

ありがとうございます。私はそうした。 –

+0

プラットフォームは同時にmysqlとsql-serverですか? – McNets

答えて

0

WHERE句は、ユニオンクエリポイントのすべての部分を、データを含むこともあれば含まない正確な単一の日付に変更することを検討してください。また、更新されたWHEREの条件は行数を拡張するため、すべての部分で毎日の集約を繰り返します。 MTD、QTD、またはYTD列を維持する必要はありません。すべての列がGRPおよびラベル定数で集計できるため、GROUP BYの必要はありません。

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の計算された集合は除外します。

関連する問題