首页 > 解决方案 > 使用 CROSS JOIN 添加额外的列

问题描述

这是我上一个问题的后续问题: 标识符无法在多个公用表表达式中绑定

我想添加一个名为“总体平均”的列来显示使用 CROSS JOIN 的所有行的总体运输天数:

WITH orderDetails (days, state) 
AS(
    SELECT DATEDIFF(day, o.OrderDate, ol.ShipDate), o.State 
    FROM SQLBook.dbo.Orders o
    JOIN [SQLBook].dbo.OrderLines ol
    ON ol.OrderId = o.OrderId
)
,
/* This finds the overall average shipping days */
AvgShipping (avgShip)
AS(
    SELECT AVG(DATEDIFF(day, o.OrderDate, ol.ShipDate))
    FROM SQLBook.dbo.Orders o
    JOIN [SQLBook].dbo.OrderLines ol
    ON ol.OrderId = o.OrderId
)

SELECT
    ord.state,
    AVG(ord.days) AS "Average days to ship",
    a.[Overall Average] AS "Overall Average"
FROM orderDetails ord
CROSS JOIN
(SELECT avgShip AS "Overall Average" FROM AvgShipping) a
GROUP BY state
HAVING AVG(days) > (SELECT avgShip FROM AvgShipping)
ORDER BY state

但是,我得到一个“列 'a.Overall Average' 在选择列表中无效,因为它既不包含在聚合函数也不包含在 GROUP BY 子句中”错误。有人可以解释为什么我会收到这个错误以及如何解决它吗?

谢谢

标签: sqlsql-serverjoincommon-table-expression

解决方案


正如我在评论中建议的那样,在您的选择中使用。

 min(a.[Overall Average]) 

这应该可以解决问题,并且应该为您提供所需的输出。

这将确保聚合函数用于选择而不是分组依据的列。此外,由于您是从交叉连接中提取字段,因此您可以使用任何聚合函数,例如 min、max 等,结果/输出将是相同的。


推荐阅读