2012-03-29 18 views
2

私の頭は、過去2時間以内にSQL Serverと結合について読んだことがすべて爆発するところです。テーブルAに重複レコードがあるときに結合する

tbl_customers 
------------- 
IPaddress 
CustomerID 


tbl_purchases 
------------- 
OrderID (pkey) 
CustomerID 
OrderTotal 

IPアドレスあたりの購入総額を取得したいとします。重複する(IPaddress、CustomerID)行が存在するように、tbl_customersテーブルにはさらに多くの列があります。私は、次のクエリを使用している:

SELECT DISTINCT IPaddress, SUM(OrderTotal) FROM tbl_customers a 
INNER JOIN tbl_purchases b ON a.CustomerID = b.CustomerID 
GROUP BY IPaddress; 

をしかし、それはtbl_customersから重複行を取得し、同じ購入を複数回カウントするsum関数の原因となります。私は間違って何をしていますか?私が10Kのレコードの下で扱っているように、効率は実際問題ではありません。

+1

おそらくIPaddressはtbl_purchasesにあるはずです。 –

答えて

2
SELECT tc.IPaddress,SUM(tp.OrderTotal) 
FROM (SELECT DISTINCT IPaddress,CustomerID FROM tbl_customers) tc, 
    tbl_purchases tp 
WHERE tc.CustomerID = tp.CustomerID 
GROUP BY tc.IPaddress; 

OR

SELECT tc.IPaddress,SUM(tp.OrderTotal) 
     FROM (SELECT DISTINCT IPaddress,CustomerID FROM tbl_customers) tc 
       INNER JOIN 
      tbl_purchases tp 
      ON tc.CustomerID = tp.CustomerID 
GROUP BY tc.IPaddress; 
+1

なぜJOIN(INNER/LEFT)構文の代わりにカンマを使用してテーブルに参加していますか? – Taryn

+0

これを今すぐテストしています... – jlarkins

+0

@jlarkins JOINの代わりにカンマを使用するのは、構文の別の方法です。 INNER JOINがSQLで導入される前に、table1、table2、およびWHEREステートメントを使用していることを覚えていれば覚えています。したがって、カンマを使用して、WHERE文にジョイン句を移動するか、INNER JOINを好きなように使用することができます。 – YvesR

0

まず第一に、あなたのDBは、正規化されていないように、それが鳴ります。顧客のテーブルがあり、同じCustomerIdを持つ複数の行がある場合、テーブルには主キーがありますか、それとも顧客を識別するためのキーになっていますか?

+0

tbl_customersは顧客を保有するためのものではありません。私の例は一般公開用にサニタイズされています。 – jlarkins

0

IPアドレスあたりの購入総額を取得したいとします。

現在のスキーマを使用して、顧客が複数のIPから購入した場合、その数量を得ることはできません(その顧客のIPなどすべてを平均しない限り)。おそらくIPaddresstbl_purchasesにあるはずです。

+0

はい、私は気付いていますが、複数の他のソースからこれらのテーブルのデータをコンパイルしているので、私はその特権を持っていません。少なくとも、私はまだどのようになったのか分かりませんでした。 – jlarkins

+0

複数のIPを持つ顧客がいますか?そうであれば、規定の要件を満たすことができないか、販売を適用するためにIPを1つ選択するか、平均を取るか何かを選択する必要があります。 –

+0

複数のIPを持つ顧客の場合、両方のIPの注文合計を数えたいと思うでしょう。したがって、Bobが192.168.1.1から500ドルの注文を、192.168.1.2から300ドルの注文を受けている場合、私は800ドルが各IPに関連付けられていることを確認したいと思います。 – jlarkins

関連する問題