缺少数据时将NULL行插入SQL

时间:2016-04-30 18:59:16

标签: sql sql-server

尊敬的StackOverflow社区 -

我在Initech工作,作为对Lumbergh先生的直接报告。我有责任确保所有员工都在阅读,更重要的是,遵守我们的TPS报告。最重要的是,所有员工都热情地为公司庆祝活动带来菜肴。它有助于给公司一些天赋。

为了确保每个人都充分表达自己,我有以下SQL输出:

  ID | Name | Location | Holiday | Time | DishCnt | TastedGood
  1    Bill    1st Fl.    Easter    AM       3          Yes
  1    Bill    1st Fl.    Easter    PM       3          Yes
  1    Bill    1st Fl.    Kawanza   AM       2          Yes
  6    Sameer  1st Fl.    Easter    AM       1          No
  6    Sameer  1st Fl.    Easter    PM       2          Yes
  6    Sameer  1st Fl.    Kawanza   AM       1          Yes
  7    Peter   1st Fl.    Easter    AM       1          No
  7    Peter   1st Fl.    Kawanza   AM       2          No

如何在此处确定人们实际做什么?我想要的是一个表,其中包含任何缺少假日和时间组合的空行。从上面的示例中,我会看到每个人列出以下组合的菜肴数量:

Easter / AM
Easter / PM
Kawanza / AM

如果表格是根据需要构建的,它将如下所示:

  ID | Name | Location | Holiday | Time | DishCnt | TastedGood
  1    Bill    1st Fl.    Easter    AM       3          Yes
  1    Bill    1st Fl.    Easter    PM       3          Yes
  1    Bill    1st Fl.    Kawanza   AM       2          Yes
  6    Sameer  1st Fl.    Easter    AM       1          No
  6    Sameer  1st Fl.    Easter    PM       2          Yes
  6    Sameer  1st Fl.    Kawanza   AM       1          Yes
  7    Peter   1st Fl.    Easter    AM       1          No
**7    Peter   1st Fl.    Easter    PM     NULL         NULL**
  7    Peter   1st Fl.    Kawanza   AM       2          No

正如我们所看到的,已经为彼得添加了一个新行,用于识别丢失的菜肴。看起来他可能不是有些人声称他的直射手。

我们的SQL管理员在某种程度上是一个没有天赋的小丑,所以你能够提供的将第一张表转换成第二张表的任何帮助都将非常受欢迎。具体来说,它必须:

  • 确定原始表格中存在的假日和时间的所有组合。
  • 生成一个包含所有原始行的新表,以及任何缺少的观察结果为NULL。

迄今为止的努力更新:

这对我来说是星期一的情况。我已经深入研究了这一点,但无济于事。我强烈怀疑解决方案将涉及在原始表中找到Holiday / Time的不同组合,然后以某种方式将其连接回原始表,以便将任何缺失的组合添加为NULLS。我的O'Reilly SQL Cookbook似乎已经接近了,但是我无法理解我将加入这两个表的内容,以便添加缺失的观察结果。

在最终会消耗这些数据的R中,我可以通过Hadley的一些软件包(例如tidyr)来解释它,但我希望在SQL中解决这个问题 - 对此我的经验要少得多。

1 个答案:

答案 0 :(得分:1)

SELECT * 
FROM Holidays H
CROSS JOIN Times T
LEFT JOIN Report R ON H.HoludayKey = R.HolidayKey AND T.TimeKey=R.TimeKey
  • CROSS JOIN为我们提供假期/时间的所有可能组合。
  • 即使没有匹配的TPS报告行,LEFT JOIN也会向我们提供所有假期+时间记录