表A具有重复记录时加入

时间:2012-03-29 17:47:03

标签: sql-server join duplicates sum

我的头脑即将爆炸,我在过去2小时内阅读了有关SQL Server和Joins的所有信息。

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


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

我想获得每个IP地址的总购买金额。 tbl_customers表中有更多列,因此存在重复的(IPaddress,CustomerID)行。我使用了以下查询:

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以下的记录。

3 个答案:

答案 0 :(得分: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 :(得分:0)

首先,听起来你的数据库没有规范化。如果您有一个客户表和多个具有相同CustomerId的行,该表是否具有主键,或者这应该是识别客户的关键?

答案 2 :(得分:0)

  

我想获得每个IP地址的总购买金额。

使用您当前的架构,如果客户从多个IP购买,那么您不可能获得这样的金额(除非您想要平均所有该客户的IP或其他金额)。也许IPaddress应该在tbl_purchases