用于创建缺失范围行的SQL查询

时间:2016-12-09 00:05:46

标签: sql sql-server sql-server-2008

这可能不是问题的最佳描述,但我们走了。

所以我有一些看起来像这样的数据,请注意,对于Schoolhouse项目,Tom只有12/4&的条目。 12/8而对于泳池项目,他在25日之前有一个入口。

Consultant   Project       PM    Week        Hours
Tom          Schoolhouse  Sue    12/4/2016     4
Tom          Schoolhouse  Sue    12/11/2016    6
Tom          Pool         Joe    12/4/2016     9
Tom          Pool         Joe    12/11/2016    8
Tom          Pool         Joe    12/18/2016    12
Tom          Pool         Joe    12/25/2016    3

我正在寻找一个查询,我可以在所有项目的整个范围内输出行。理想情况下,结果看起来像这样

Consultant   Project       PM    Week        Hours
Tom          Schoolhouse  Sue    12/4/2016     4
Tom          Schoolhouse  Sue    12/11/2016    6
Tom          Schoolhouse  Sue    12/18/2016    0
Tom          Schoolhouse  Sue    12/25/2016    0
Tom          Pool         Joe    12/4/2016     9
Tom          Pool         Joe    12/11/2016    8
Tom          Pool         Joe    12/18/2016    12
Tom          Pool         Joe    12/25/2016    3

现在这里是踢球者...我在一个我有限制SQL功能的系统中编写这个查询。我不能使用函数或游标或变量。我只能写一个基本的SQL语句。我确实试图找出一些东西,我填写了一张桌子,里面有我需要的范围,然后加入到这张桌子中,但它并没有像我期望的那样工作。

2 个答案:

答案 0 :(得分:2)

试试这个:

select d.Consultant, p.Project, 
     d.PM, w.Week, isnull(d.Hours, 0) hours
From 
    (Select distinct project from mytable) p
      cross join
    (Select distinct week from myTable) w
  left join mytable d
      on d.project = p.Project
         and d.week = w.week

如果顾问和pm依赖于Project,那么:

select p.Consultant, p.Project, 
     p.PM, w.Week, isnull(d.Hours, 0) hours
From 
    (Select distinct Consultant, project, PM from mytable) p
      cross join
    (Select distinct week from myTable) w
  left join mytable d
      on d.project = p.Project
         and d.week = w.week

答案 1 :(得分:2)

查尔斯的想法是正确的,但你需要包括正确的列并从正确的表中选择:

select t.Consultant, t.Project, t.PM, w.Week,
       coalesce(t.Hours, 0) as hours
From (Select distinct Consultant, Project, PM from t) cpp cross join
     (Select distinct week from t) w left join
     t 
     on t.consultant = cpp.consultant and .project = cpp.Project and
        t.PM = cpp.PM and t.week = w.week;