通过查询正确加入/分组

时间:2014-12-18 14:34:25

标签: sql sql-server group-by right-join

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

WeeksOfyear

ID  Week_Beginning

1   2013-12-29

2   2014-01-05

3   2014-01-12

PROJECT

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表中选择每一行并进行子查询来计算那周的项目,但这似乎是一种非常低效的方法。

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

由于

亚当

1 个答案:

答案 0 :(得分: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

相关问题