sql - 无法在多个公用表表达式中绑定标识符
问题描述
我正在使用“使用 SQL 和 Excel 进行数据分析”一书中的 SQLBook 数据库来显示总运输天数高于平均总运输天数的州的平均运输天数。我正在使用 2 个公用表表达式:
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
state,
AVG(days) AS "Average days to ship"
FROM orderDetails
GROUP BY state
HAVING AVG(days) > AvgShipping.avgShip
ORDER BY state
问题是我不断收到“无法绑定多部分标识符“AvgShipping.avgShip””错误。请让我知道这个查询的问题出在哪里。
谢谢!
解决方案
您需要放入外部查询AvgShipping
的from
子句,以便您可以使用它的列:
WITH ...
SELECT od.state, AVG(od.days) AS average_days_to_ship
FROM orderDetails od
CROSS JOIN AvgShipping s
GROUP BY od.state, s.avgShip
HAVING AVG(od.days) > s.avgShip
ORDER BY od.state
但我认为使用窗口函数可以更有效地完成这项任务:
select *
from (
select state,
avg(datediff(day, o.orderdate, ol.shipdate)) as avg_days_state,
1.0 * sum(sum(datediff(day, o.orderdate, ol.shipdate))) over()
/ sum(count(*)) over() as avg_days_overall
from sqlbook.dbo.orders o
inner join sqlbook.dbo.orderlines ol on ol.OrderId = o.OrderId
group by state
) t
where avg_days_state > avg_days_overall
我们可以通过避免聚合和使用来简化逻辑distinct
:
select distinct state, avg_days_state, avg_days_overall
from (
select state,
avg(datediff(day, o.orderdate, ol.shipdate)) over(partition by o.state) as avg_days_state,
avg(datediff(day, o.orderdate, ol.shipdate)) over() as avg_days_overall
from sqlbook.dbo.orders o
inner join sqlbook.dbo.orderlines ol on ol.OrderId = o.OrderId
) t
where avg_days_state > avg_days_overall
推荐阅读
- python - AttributeError:“超级”对象在从文本字段中获取值时没有属性“__getattr__”
- visual-studio-2019 - 如何在 Visual Studio 2019 中添加 Solidity 文件?
- python-3.x - 如何使用 scipy 的最小二乘法
- javascript - Vuexfire bindFirestoreRef 不等待绑定完全解决
- javascript - 有人可以解释一下代码执行的这种行为吗?JS
- django - 使用 WhiteNoise 在生产模式下将 django 部署到 Elastic Beanstalk
- java - 给定一组集合,如何有效地找到至少有一个共同成员的集合?
- javascript - 正则表达式匹配句子中的字符串
- reactjs - 即使 DB 已正确更新,React UI 也不会在单击时重新渲染。第二次点击后,UI 重新渲染
- makefile - 为什么 make 重新编译所有文件?