Sql 按日、月、季和生成销售数据;年度组

Sql 按日、月、季和生成销售数据;年度组,sql,sql-server,Sql,Sql Server,我正在尝试编写一份报告,该报告将生成4组销售数据:每日、每月、季度和年度。我遇到的问题是,如果没有日常活动,它将不会生成月度、季度或年度报告。我如何获得没有数据生成0的天数,并且仍然计算其他三组?以下是我尝试使用的代码(它还没有将年份作为一个组包括在内): 谢谢大家! 考虑更改WHERE子句,因为union查询的所有部分都指向精确的单个日期,该日期可能/可能不包含数据。此外,在更新后的所有部分重复每日聚合,其中条件将扩展行数。不需要维护MTD、QTD或YTD列。另外,由于所有列都可以使用GRP和

我正在尝试编写一份报告,该报告将生成4组销售数据:每日、每月、季度和年度。我遇到的问题是,如果没有日常活动,它将不会生成月度、季度或年度报告。我如何获得没有数据生成0的天数,并且仍然计算其他三组?以下是我尝试使用的代码(它还没有将年份作为一个组包括在内):


谢谢大家!

考虑更改
WHERE
子句,因为union查询的所有部分都指向精确的单个日期,该日期可能/可能不包含数据。此外,在更新后的所有部分重复每日聚合,其中条件将扩展行数。不需要维护MTD、QTD或YTD列。另外,由于所有列都可以使用GRP和Label常量进行聚合,所以无需使用
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
) 

旁白-理想情况下,您可以使用datetime字段来维护日期/时间部分,以提取日/周/月/季度/年指标。同样如上所示,仅在一组美元账单、MsfBilled、贡献、利润列上进行聚合,而不包括MTD、QTD、YTD的计算集。

请使用db平台进行标记。谢谢。我已经这样做了。你的平台是mysql和sql server?微软sql server用户认为他们在使用mysql是一个奇怪的常见错误。我一直不明白为什么他们认为这两种产品是一样的。也许他们听不到超过第一个音节的声音?抱歉搞混了。我把mysql误读为mssql——从严重的感冒中恢复过来。我们使用Microsoft SQL Server 2014
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
)