2013-07-27 116 views
3

假設我有一個用戶表和銷售訂單具有以下模式的表之後計數記錄:SQL/SQL-LITE - 過濾

  1. 客戶= {ID,名稱}
  2. sales_order的= { ID,CUSTOMER_ID,sales_representer}

用下面defintions:

  1. id爲兩個表中的主鍵。
  2. customer_id是一個foriegn關鍵客戶。

我要實現以下查詢:

For any customer whose sales_representer is 100, find the customer id, 
customer name and the number of his overall orders. 

我建立以下查詢:

select C.id, C.name, count(C.id) 
from customer C, sales_order S 
where C.id = S.customer_id and 
     S.sales_represntor = '100' 
group by C.id, C.nname; 

但作爲計數(C.id)結果我得到的只有數salesclient爲100的銷售額。 我知道我可以添加sales_order的另一個實例(即S2)並從中進行計數,但在我看來,這根本不算高效。

有沒有人有解決方案?

謝謝

回答

2

您可以使用相關子查詢來計算銷售數量。 (SQLite中,子查詢常常爲連接高效。)

SELECT id, 
     name, 
     (SELECT COUNT(*) 
     FROM sales_order 
     WHERE customer_id = customer.id) AS orders 
FROM customer 
WHERE id IN (SELECT customer_id 
      FROM sales_order 
      WHERE sales_representer = '100') 

如果你關心效率,你應該檢查查詢與EXPLAIN QUERY PLAN,甚至更好,只是衡量他們。

+0

以下解決方案是否也不錯?選擇C.id,C.name,從客戶C,sales_order的S,sales_order的TS 其中\t C.id = S.cust_id和 \t \t C.id = TS.cust_id和 \t \t計數(TS.cust_id) S.sales_rep ='100' group by C.id,C.name; – SyndicatorBBB

+0

我希望你能理解上面寫的東西..我只是不知道如何在評論框中做一個新行。 – SyndicatorBBB

+0

額外的連接會導致錯誤的(計數)記錄數。 –

2

你可以使用一個having條款,要求至少有一個銷售是通過代表100:

select C.id 
,  C.name 
,  count(*) as TotalSaleCount 
from customer C 
join sales_order S 
on  C.id = S.customer_id 
group by 
     C.id 
,  C.name 
having count(case when S.sales_representor = '100' then 1 end) > 0 
2

您是否希望有條件的聚合,從而解決這個問題:

select C.id, C.name, count(*) as Total_Orders, 
     sum(case when S.sales_representor = '100' then 1 else 0 end) as SR100_Orders 
from customer C join 
    sales_order S 
    on C.id = S.customer_id 
group by C.id, C.nname; 

請注意,我還更改了查詢以使用明確的,適當的join語法。這就是你應該學習編寫查詢的方式。