将当前行值用于子查询

时间:2013-04-25 13:31:08

标签: sql

我正在尝试计算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'无效。

2 个答案:

答案 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)

您不能在子查询中使用结果列的名称。为子查询命名Orderso并执行WHERE Customer_id = o.Customer_Id。最好为这些表中的每一个组成别名,以便它们不会混淆。