【问题标题】:SQL reflect data for all daysSQL 反映所有日期的数据
【发布时间】:2022-07-18 22:39:14
【问题描述】:

我正在尝试在 SQL 中创建一个表,在其中反映特定月份所有天的数据。

例如,即使特定日期没有销售交易,特定员工的日期仍应反映在表格中。

问题的场景。我正在处理此示例的以下日期:2022 年 1 月 1 日、2 日、3 日和 4 日。

原始数据如下:

Name Date SaleAmount
John 2022-01-01 154875
John 2022-01-03 598752

如上所示,我们只有第 1 次和第 3 次的数据。

结果应如下所示:

Name Date SaleAmount
John 2022-01-01 154875
John 2022-01-02 NULL
John 2022-01-03 598752
John 2022-01-04 NULL

如上所示,即使那几天没有活动,也应包括第 2 天和第 4 天。

我目前正在尝试什么:

我有一个主日期表,它被用作事务表上的 RIGHT JOIN。但是,我的表的最终结果如下:

Name Date SaleAmount
John 2022-01-01 154875
NULL 2022-01-02 NULL
John 2022-01-03 598752
NULL 2022-01-04 NULL

如上所示,“名称”字段返回为 NULL。但是,SaleAmount 应该反映 NULL 以指示没有交易发生。

我将不胜感激。

【问题讨论】:

  • 您希望在 1 月 2 日为 每一位 员工在其他任何一天至少进行过一次交易吗?或者该集合是否已明确过滤到单个员工?
  • 嗨@AaronBertrand。是的,每个员工都会在 1 月 2 日排队。

标签: sql sql-server database tsql azure-sql-database


【解决方案1】:

好像你愿意

  • 从日期表开始
  • 交叉联接到您的员工/销售人员表,这样您现在每个日期的每个销售人员都有一行
  • 左加入该日期的销售订单 + 销售人员组合以获得当天的销售额总和。如果他们没有,它将显示 null:
select emp.Name
      ,dat.Date
      ,sum(ord.Amount) as SaleAmount
from            dateList    dat
     cross join salesPerson emp
      left join salesOrder  ord on ord.OrderDate = dat.Date and ord.SalesPersonId = emp.SalesPersonId
group by emp.Name
        ,dat.Date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 2020-12-24
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多