Присоединяйтесь, когда в таблице А есть повторяющиеся записи - PullRequest
2 голосов
/ 29 марта 2012

Моя голова взорвется от всего, что я прочитал о SQL Server и Joins за последние 2 часа.

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 и заставляет функцию суммы подсчитывать одну и ту же покупку несколько раз.Что я делаю неправильно?Эффективность на самом деле не проблема, так как я имею дело с записями под 10K.

Ответы [ 3 ]

2 голосов
/ 29 марта 2012
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;

ИЛИ

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;
0 голосов
/ 29 марта 2012

Я хочу получить общую сумму покупки по IP-адресу.

Используя вашу текущую схему, если клиент совершает покупки с более чем одного IP, вы не сможете получить такойсумма (если вы не хотите усреднить сумму по всем IP-адресам этого клиента или что-то в этом роде).Возможно IPaddress должно быть в tbl_purchases.

0 голосов
/ 29 марта 2012

Прежде всего, похоже, что ваша БД не нормализована. Если у вас есть таблица для клиентов и несколько строк с одним и тем же CustomerId, есть ли у таблицы первичный ключ или это должен быть ключ для идентификации клиента?

...