我的头脑即将爆炸,我在过去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以下的记录。
答案 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
。