SQL Server:带有 GROUP BY 子句的 OUTER JOIN 不会返回所有可能的组合?

Posted

技术标签:

【中文标题】SQL Server:带有 GROUP BY 子句的 OUTER JOIN 不会返回所有可能的组合?【英文标题】:SQL Server : OUTER JOIN with GROUP BY clause doesn't return all possible combinations? 【发布时间】:2013-11-19 01:23:08 【问题描述】:

我正在查询两个表:

    tblPurhcaseOrders - 保存具有各种列的采购订单,其中一个是名为 OrderTypeID 的外键 tblOrderTypes - 持有 4 种类型的采购订单

tblOrderTypes 中的一种订单类型是在前 3 个基本类型之后添加的。因此,具有这种较新订单类型的采购订单实例仅在某个时间点(2012 年 2 月)出现。

我正在编写一个聚合查询,它最终会为我提供所有采购订单的总和,按类型分组。

我确实希望结果为 0 或 NULL,即使我查询一个尚未存在新订单类型的时间点。

我的查询如下所示:

SELECT
   MONTH(tblPurchaseOrders.DeliveryDate) AS sMonth,
   YEAR(tblPurchaseOrders.DeliveryDate) AS sYear, 
   tblOrderType.OrderTypeName,
   SUM(ISNULL(TotalPrice,0)) AS sValue 
FROM        
   tblPurchaseOrders 
RIGHT OUTER JOIN 
   tblOrderTypes ON tblPurchaseOrders.OrderTypeID = tblOrderTypes.OrderTypeID  
WHERE       
   MONTH(DeliveryDate) = 1  
   AND YEAR(DeliveryDate) = 2012
GROUP BY
   MONTH(DeliveryDate), YEAR(DeliveryDate), tblOrderType.OrderTypeName

现在,上面的查询工作正常,并为我提供了正确的聚合,只是它忽略了较新的订单类型(提醒,它在 2012 年 1 月还不存在)。

如果我将查询条件更改为MONTH(DeliveryDate) = 2 AND YEAR(DeliveryDate) = 2012,它就会出现。

我尝试了完全连接,也尝试在两个表的顺序之间切换并切换到LEFT OUTER JOIN,没有运气。

【问题讨论】:

【参考方案1】:

改变

WHERE       
   MONTH(DeliveryDate) = 1  
   AND YEAR(DeliveryDate) = 2012

进入

AND
   MONTH(DeliveryDate) = 1  
   AND YEAR(DeliveryDate) = 2012

【讨论】:

当我将条件转移到 JOIN 子句时,您建议的解决方案非常有效。谢谢@Madhivanan。

以上是关于SQL Server:带有 GROUP BY 子句的 OUTER JOIN 不会返回所有可能的组合?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

带有 Group By 子句的 SQL 逗号分隔行

SQL 查询,特定字段上的一条记录,带有 group by 子句

带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN

SQL Server 数据库中带有 Group by 子句的 JPQL 不起作用

如何从表中选择带有 oracle sql 中的 group by 子句的嵌套 json 对象?