2016-10-31 2 views
0

Я уверен, что этот вопрос задан раньше, поэтому, пожалуйста, помогите мне в правильном направлении, если так, но мой вопрос в этом.SQL Join вызывает несколько добавлений

У меня есть SQL-запрос, который собирает данные о продажах от 2-х таблиц - CustomerInvoice и CustomerInvoiceDetail

CustomerInvoice содержит общие данные о счете, например, имя клиента, адрес и т.д., но также включает в себя грузовые суммы.

Пример таблицы данных (одна запись на код счета-фактуры):

╔══════════════╦═══════════════╦════════════════════════════╦═════════╗ 
║ Invoice Code ║ Customer Name ║ Address     ║ Freight ║ 
╠══════════════╬═══════════════╬════════════════════════════╬═════════╣ 
║ INV-200000 ║ ABC Co  ║ 1 Apple Street, FRUITVILLE ║ 20  ║ 
╚══════════════╩═══════════════╩════════════════════════════╩═════════╝ 

CustomerInvoiceDetail содержит информацию о каждой позиции из счета-фактуры. Часто в одном счете есть несколько позиций.

данных Пример таблицы (несколько записей на номер счета-фактуры)

╔══════════════╦═════════════╦══════════╦═══════╦══════════╗ 
║ Invoice Code ║ Part Number ║ Quantity ║ Price ║ ExtPrice ║ 
╠══════════════╬═════════════╬══════════╬═══════╬══════════╣ 
║ INV-20000 ║ 50505  ║ 2  ║ 5  ║ 10  ║ 
╠══════════════╬═════════════╬══════════╬═══════╬══════════╣ 
║ INV-20000 ║ 51325  ║ 3  ║ 2  ║ 6  ║ 
╚══════════════╩═════════════╩══════════╩═══════╩══════════╝ 

Это означает, мои JOIN результаты в нескольких результатов из CustomerInvoice таблицы, то есть в случае образца, перевозка будет $ 40: линия 2 пункты х $ 20 фрахта.

Мой запрос следующим образом, умножает количество грузов (на столе CustomerInvoice) по количеству позиций (на столе CustomerInvoiceDetail)

Что я сейчас получаю, является цена продажи + (фрахт * номер строки пункты CustomerInvoiceDetail)

Что мне нужно, это цена продажи + один экземпляр груза (в образце случае 10 + 6 + 20)

SELECT 
    SUM(cid.ExtPrice + ci.Freight) AS 'Sales' 
FROM CustomerInvoice ci 
JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode 

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

+3

Каков ваш желаемый результат? Возможно, это только я, но я не совсем вижу * вопрос * здесь ... вы можете уточнить? – Santi

+1

и вопрос? – James

+0

@Santi - не только вы ... –

ответ

0

Вам необходимо агрегировать перед тем вы делаете сумму:

SELECT (cid.ExtPrice + ci.Freight) AS Sales 
FROM (SELECT SUM(ci.Freight) as Freight 
     FROM CustomerInvoice ci 
    ) ci CROSS JOIN 
    (SELECT SUM(cid.ExtPrice) as ExtPrice 
     FROM CustomerInvoiceDetail cid 
    ) cid; 

Из-за JOIN вы умножив количество строк для Freight для каждого счета-фактуры.

+0

Спасибо за ваш ответ Гордон!Я использую только простой язык SQL, не могли бы вы объяснить свой ответ немного больше? Или, возможно, укажите мне документацию? –

+0

Вам не нужно группироваться и присоединяться к столбцу id? – Hogan

+0

@ Хоган. , , Первоначальный вопрос, похоже, требует всего общего. –

0

Я считаю, что вы можете избежать подзапросов, делая что-то вроде этого:

SELECT 
    cid.InvoiceCode, SUM(cid.ExtPrice) + MAX(ci.Freight) AS 'Sales' 
FROM CustomerInvoice ci 
JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode 
GROUP BY cid.InvoiceCode 

Пример вывода:

╔══════════════╦═════════════╗ 
║ Invoice Code ║ Sales  ║ 
╠══════════════╬═════════════╣ 
║ INV-20000 ║ 36   ║ 
╠══════════════╬═════════════╣ 
║ INV-20001 ║ 100   ║ 
╠══════════════╬═════════════╣ 
║ INV-20002 ║ 50   ║ 
╚══════════════╩═════════════╝ 

Вы можете добавить WHERE InvoiceCode='INV-20000' выбрать только один счет-фактуру, если это будет необходимо.

+0

Вам нужна группа по – Hogan

+0

@Hogan Вы правы. Я считаю, что это должно сработать. – Santi

+0

@Santi Есть ли способ сгруппировать эти коды счетов, чтобы дать мне общую стоимость продаж, включая фрахт? Использование 'MAX' выбирает только одну сумму груза - самую большую –

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