2013-04-25 40 views
2

我正在嘗試計算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'。

+0

你需要把你的子查詢放在'from' – jle 2013-04-25 13:36:45

+0

之後你能解釋一下你的模式以及你的最終目標是什麼嗎?也許做一個sqlfiddle? – jle 2013-04-25 13:39:56

回答

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 

您打算爲這個使用的值從外部查詢(「人」)涉及到內部一個(「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」是在外部查詢命令的別名。相關的子查詢不需要。你應該簡化查詢。

+0

OrderId不是唯一的。它在 – 2013-04-25 13:40:24

+0

@ jayt.dev表中多次出現。 。 。不是一個好的命名約定,但第一個查詢應該可以工作。 – 2013-04-25 13:41:36

1

不能在使用你的結果列名一個子查詢。命名您的子查詢Orderso並做WHERE Customer_id = o.Customer_Id。最好爲這些表中的每一個組成別名,以便它們不會混淆。

+0

如何命名子查詢訂單「o」? – 2013-04-25 13:38:57

相關問題