2012-03-29 2 views
2

Моя голова вот-вот взорвется всем, что я прочитал о SQL Server и Joins за последние 2 часа.Присоединитесь, когда таблица A имеет повторяющиеся записи

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 записей.

+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; 

ИЛИ

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 - это просто другой способ синтаксиса. Если я правильно помню таблицу1, table2 и используя инструкцию WHERE, это было до того, как INNER JOIN был введен в SQL. Таким образом, вы можете использовать запятую и переместить предложение join в инструкцию WHERE или использовать INNER JOIN по своему усмотрению. – YvesR

0

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

+0

tbl_customers не для того, чтобы держать клиентов как таковые, мой пример был дезинфицирован для публичной публикации. – jlarkins

0

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

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

+0

Да, я это понимаю, но поскольку я собираю данные в этих таблицах из нескольких других источников, у меня нет этой привилегии. По крайней мере, я еще не понял, как это сделать. – jlarkins

+0

У вас есть клиенты с несколькими IP-адресами? Если это так, вы не можете удовлетворить заявленное требование, или вам нужно выбрать один IP-адрес для применения продаж или усреднить их или что-то еще. –

+0

В случае клиента с несколькими IP-адресами, я хотел бы подсчитать их сумму для обоих IP-адресов. Поэтому, если у Боба есть заказ в размере 500 долларов США от 192.168.1.1 и порядка $ 300 от 192.168.1.2, я хочу увидеть 800 долларов США, связанных с каждым IP-адресом. – jlarkins

Смежные вопросы