【问题标题】:Right Join / Group by queryRight Join / Group by query
【发布时间】:2025-12-27 01:25:11
【问题描述】:

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

这让我很困惑,非常感谢任何帮助。

谢谢

亚当

【问题讨论】:

  • HAVING 子句通常用于聚合函数条件。考虑将条件移至 ON 子句(因为它是外连接。)

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


【解决方案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 中,如果你正在计算的话。

【讨论】:

  • 他需要 GROUP BY 中的 p.FK_Programm 吗?它没有被选中。
  • @JoachimSauer 。 . .它不是必需的并且会导致问题,因为NULL 值将与匹配值分开。谢谢。
  • 嘿,太棒了,谢谢,当你知道怎么做的时候就这么简单!只是出于兴趣(所以我可以学习)为什么我的查询没有返回所有行?我假设一个右连接会保证左表中的所有行都会被返回?
  • @acgt1008 。 . .我很确定having 子句的原因。