我正在尝试计算 order_Id 在子查询中出现的次数,然后将其显示在每个客户订单的平均值旁边。这是我尝试过的。
select person ,AVG(orderTotal) as avgOrdersValue , timesSeen
from
(
select
Customer_Id as person
,Order_Id
, SUM(total)as orderTotal
,(select COUNT(Order_Id) as timesSeen
from Orders where Customer_Id=person group by Order_Id
)
from Orders group by Customer_Id Order_Id order by person ) tablealias
group by person
这是我收到的消息:“消息 207,级别 16,状态 1,第 4 行
无效的列名“人”。
消息 8155,级别 16,状态 2,第 10 行
没有为“gg”的第 4 列指定列名。
消息 207,级别 16,状态 1,第 1 行
无效的列名 'timesSeen'。”
最佳答案
根据您的描述,这可能是您想要的查询:
select person, AVG(OrderTotal), COUNT(distinct orderId)
from (select Customer_id as person, Order_id, SUM(total) as OrderTotal
from Orders
group by Customer_Id, Order_Id
) o
group by person
我说“可能”是因为我希望
OrderId
是 Orders
表中的唯一键。所以,内部子查询不会做任何事情。也许您的意思是内部查询中的 OrderLines
之类的东西。您的查询失败的原因是相关语句:
where Customer_Id = person
您打算为此使用来自外部查询(“person”)的值与内部查询(“Customer_Id”)相关联。但是,内部查询不知道外部查询的
select
子句中的别名。所以,“人”是未定义的。进行相关子查询时,应始终使用表别名。该查询应该看起来更像:(select COUNT(o2.Order_Id) as timesSeen
from Orders o2 where o2.Customer_Id=o.person
group by o2.Order_Id
)
假设“o”是外部查询中订单的别名。不需要相关的子查询。您应该简化查询。
关于sql - 将当前行值用于子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16216129/