4

我正在尝试计算 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 Invalid column name 'person'. Msg 8155, Level 16, State 2, Line 10 No column name is specified for column 4 of 'gg' . 消息 207,级别 16,状态 1,第 1 行无效的列名称“timesSeen”。

4

2 回答 2

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”是外部查询中订单的别名。不需要相关的子查询。您应该只简化查询。

于 2013-04-25T13:36:37.443 回答
1

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

于 2013-04-25T13:35:48.267 回答