我正在尝试计算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
以下是我得到的消息:“ Msg 207,Level 16,State 1,Line 4 列名称“人员”无效。 Msg 8155,Level 16,State 2,Line 10 没有为'gg'的第4列指定列名。 Msg 207,Level 16,State 1,Line 1 列名称'timesSeen'无效。“
答案 0 :(得分:6)
根据您的说明,这可能是您想要的查询:
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”是外部查询中的订单的别名。不需要相关的子查询。您应该简化查询。
答案 1 :(得分:1)
您不能在子查询中使用结果列的名称。为子查询命名Orders
表o
并执行WHERE Customer_id = o.Customer_Id
。最好为这些表中的每一个组成别名,以便它们不会混淆。