使用 CROSS JOIN 添加额外的列
Using CROSS JOIN to add extra column
这是我之前问题的后续问题:
我想添加一个名为“总体平均值”的列来显示使用 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' 在 select 列表中无效,因为它既不包含在聚合函数中也不包含在 GROUP BY 子句中”错误。有人可以解释为什么我会收到此错误以及如何修复它吗?
谢谢
正如我在评论中建议的那样,在您的 select 中使用。
min(a.[Overall Average])
这应该可以解决问题,并且可以为您提供所需的输出。
这将确保将聚合函数用于 select 中而不是分组依据中的列。此外,由于您是从 cross-join 中提取字段,因此您可以使用任何聚合函数,例如 min、max 等,result/output 将是相同的。
这是我之前问题的后续问题:
我想添加一个名为“总体平均值”的列来显示使用 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' 在 select 列表中无效,因为它既不包含在聚合函数中也不包含在 GROUP BY 子句中”错误。有人可以解释为什么我会收到此错误以及如何修复它吗?
谢谢
正如我在评论中建议的那样,在您的 select 中使用。
min(a.[Overall Average])
这应该可以解决问题,并且可以为您提供所需的输出。
这将确保将聚合函数用于 select 中而不是分组依据中的列。此外,由于您是从 cross-join 中提取字段,因此您可以使用任何聚合函数,例如 min、max 等,result/output 将是相同的。