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 子句中
SQL 查询,特定字段上的一条记录,带有 group by 子句
带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN