2017-09-08 14 views
0

顧客がOrdersテーブルとRequestsテーブルにそれぞれ表示される回数を調べる必要があります。ただし、このスクリプトは、COUNTが使用されている両方の場所で同じカウント値を生成しています。値は同じではないので、私は何が間違っているのでしょうか?複数のテーブルでのカウントの検索

SELECT o.CustomerID, 
     COUNT(o.CustomerID) as OrdersPerCustomer, 
     COUNT(r.CustomerID) as RequestsPerCustomer 
    FROM Orders o 
    INNER JOIN [Customers] c on c.ID = o.CustomerID 
    INNER JOIN [Request] r on r.CustomerID = c.ID 
    GROUP BY o.CustomerID 
+0

サンプルテーブルのデータと期待される結果をフォーマット済みテキストとして追加します。 – jarlh

+1

'COUNT(DISTINCT r.CustomerID)'を試しましたか? – jarlh

+0

DISTINCTは行数を1だけ減らします。私は、両方のテーブルに顧客IDが表示される合計回数を期待しています。 – user1327418

答えて

1

注文番号とリクエストレコードの数を掛けています。私。テーブルを結合することで、例えば、顧客12の結果行に対して3つの注文と4つの要求が得られます。 IDはレコード内でヌルになることはありませんので、COUNT(o.CustomerID)COUNT(r.CustomerID)はちょうどCOUNT(*)(私の例では12であり、期待どおりに3と4ではありません)です。

最も簡単なアプローチ:

select 
    customer_id, 
    (select count(*) from orders o where o.customerid = c.id) as o_count, 
    (select count(*) from request r where r.customerid = c.id) as r_count 
from customers c; 

FROM句でサブクエリ(派生テーブル)と同じ:複数のテーブルから集約場合

select 
    customer_id, 
    coalesce(o.total, 0) as o_count, 
    coalesce(r.total, 0) as r_count 
from customers c 
left join (select customerid, count(*) as total from orders group by customerid) o 
    on o.customerid = c.id 
left join (select customerid, count(*) as total from request group by customerid) r 
    on r.customerid = c.id; 

、常に最初に凝集し、その後参加。

+0

それは素晴らしいです!両方のカウントがゼロのレコードを除外できる方法はありますか? – user1327418

+1

少し難しい最初のクエリです。外側のクエリ 'select * from()where o_count> 0 or r_count> 0'を書きます。次に、 'o.total> 0またはr.total> 0'を追加するだけです。 –

関連する問題