尊敬的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管理员在某种程度上是一个没有天赋的小丑,所以你能够提供的将第一张表转换成第二张表的任何帮助都将非常受欢迎。具体来说,它必须:
迄今为止的努力更新:
这对我来说是星期一的情况。我已经深入研究了这一点,但无济于事。我强烈怀疑解决方案将涉及在原始表中找到Holiday / Time的不同组合,然后以某种方式将其连接回原始表,以便将任何缺失的组合添加为NULLS。我的O'Reilly SQL Cookbook似乎已经接近了,但是我无法理解我将加入这两个表的内容,以便添加缺失的观察结果。
在最终会消耗这些数据的R中,我可以通过Hadley的一些软件包(例如tidyr)来解释它,但我希望在SQL中解决这个问题 - 对此我的经验要少得多。
答案 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
为我们提供假期/时间的所有可能组合。LEFT JOIN
也会向我们提供所有假期+时间记录