0

我有一个(SQL Server)Right Join / Group by 查询,旨在返回一年中的所有周(一周开始),并计算每周交付的项目数。该查询针对两个表运行;WeeksOfyear(其中 Week_Beginning 字段是每周第一个星期一的日期)和 projects(其中 project.Target_Date_Week_Beginning 包含项目目标交付的周开始日期。)如下所示:

周刊

ID  Week_Beginning

1   2013-12-29

2   2014-01-05

3   2014-01-12

等等

项目

ID  Name                        Target_Date_Week_Beginning  FK_Programme

1   1234-Smith Street           2014-06-29                  4
2   Marge Lane                  2014-07-20                  4
3   1234 Smith Street2          2014-10-26                  3
4   Marge Lane (Branch Design)  2015-11-01                  null
5   Papertray                   2014-11-02                  1
6   OpenSalad                   014-09-28                   1
7   Leamington Pie              2014-11-30                  1

查询的目的是返回一年中的所有星期,并计算每周交付的属于指定程序的项目数(FK_Programme(作为参数@ProgrammeParamater))。

    SELECT       dbo.WeeksOfyear.Week_Beginning, COUNT(dbo.Project.ID) AS Total_Projects
    FROM            dbo.Project right JOIN 
                  dbo.WeeksOfyear ON dbo.Project.Target_Date_Week_Beginning = dbo.WeeksOfyear.Week_Beginning
GROUP BY dbo.WeeksOfyear.Week_Beginning, dbo.Project.FK_Programme, dbo.Project.ID
HAVING        (dbo.Project.FK_Programme = @ProgrammeParamater) 
           or     (dbo.Project.ID  IS NULL)          
ORDER BY dbo.WeeksOfyear.Week_Beginning

但是,当查询运行时,返回的结果不包括项目交付但不属于指定计划的一年中的几周。奇怪的是,查询返回没有项目交付的任何一周。如果 WeeksOfYear 表中有 52 条记录,我需要查询返回 52 条记录。

我知道我可以从 WeeksOfyear 表中选择每一行并执行子查询来计算该周到期的项目,但这似乎是一种非常低效的方法。

这让我很难过,非常感谢任何帮助。

谢谢

亚当

4

1 回答 1

1

left join我发现查询在使用和表别名时更容易理解。在您的情况下,您希望将having子句中的条件一直移动到on子句,因此您只匹配正确程序中的项目。

SELECT w.Week_Beginning, COUNT(p.ID) AS Total_Projects
FROM dbo.WeeksOfyear w LEFT JOIN
     dbo.Project p 
     ON p.Target_Date_Week_Beginning = w.Week_Beginning AND
        p.FK_Programme = @ProgrammeParameter
GROUP BY w.Week_Beginning      
ORDER BYw.Week_Beginning;

如果那是您所计数的,您也不想p.Id在 中。group by

于 2014-12-18T14:42:37.290 回答