繁体   English   中英

按每日,每月,每季度和每年的组生成销售数据

[英]Generating Sales Data by Daily, Monthly, Quarterly, & Yearly Groups

我正在尝试编写一份报告,该报告将为销售数据生成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)

谢谢!

考虑将WHERE子句更改为工会查询的所有部分都指向可能包含/可能不包含数据的确切单个日期。 此外,由于更新的WHERE条件将扩大行数,因此请在所有部分重复每日汇总。 无需维护MTD,QTD或YTD列。 此外,无需GROUP BY因为所有列都可以使用GRPLabel常量进行汇总。

由于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计算组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM