2012-03-15 7 views
1

Итак, я знаю, что должен дать этот запрос, он должен дать сумму общего итога, который он выводит. Мне сложно понять, как суммировать результаты. В базе данных я использую это база данных издательстваПодведение итогов запроса

Вот мой запрос

SELECT DISTINCT authors.state, qty*price as total 
from authors 
JOIN titleauthor on titleauthor.au_id = authors.au_id 
JOIN titles on titles.title_id = titleauthor.title_id 
JOIN sales on sales.title_id = titles.title_id 
JOIN stores on stores.stor_id = sales.stor_id 
WHERE authors.state LIKE stores.state 

и вот выход дает

CA 104.6500 
CA 299.8000 
CA 299.8500 
CA 1000.0000 
+1

Если вы удалите DISTINCT, какой результат вы получите? –

+0

В основном то же самое, что я получил здесь, только с дубликатами –

+0

Это важные для вас «дубликаты»; если вы добавите идентификаторы продаж в оператор select, вы, вероятно, обнаружите, что в большинстве случаев они представляют разные продажи. Другими словами, общая стоимость продаж для калифорнийских авторов почти наверняка значительно больше, чем около 1703 долл. США, которую вы могли бы получить от суммирования отдельных значений выше. –

ответ

3

присоединяется даст вам дубликаты, потому что они включают в себя более чем одна таблица, представляющая отношение «многие ко многим», и фильтрация недостаточно для того, чтобы предотвратить переключение таблиц «многие ко многим» на несколько строк на основе данных условий соединения.

Вы можете избежать дубликатов, введя полусоединение в виде предиката EXISTS и последующего перемещения некоторых из таблиц. Вот один из возможных способов использования EXISTS в вашей ситуации:

SELECT 
    stores.state, 
    SUM(qty * price) 
FROM sales 
INNER JOIN stores ON sales.stor_id = stores.stor_id 
INNER JOIN titles ON sales.title_id = stores.title_id 
WHERE EXISTS (
    SELECT * 
    FROM authors a 
    INNER JOIN titelauthor ta ON a.au_id = ta.au_id 
    WHERE ta.titel_id = titles.title_id 
    AND a.state LIKE stores.state 
) 
GROUP BY 
    stores.state 

Центральная таблица, скорее всего, sales, это где цифры берутся. Поэтому запрос строится вокруг sales. Другие таблицы объединены явно (с использованием предложения JOIN), пока они возвращают только одну строку для каждой строки sales. Когда таблица вернется более чем к одной строке, она будет перенесена в EXISTS.

Есть еще одна вещь. Во время работы над этим запросом я заметил, что одно соединение может быть избыточным (как в вашем запросе, так и в моем). Таблица titles. Если ваши внешние ключи в порядке, вам не нужно присоединяться к titles, так как titleauthor может быть подключен непосредственно к stores по адресу title_id. (Даже если у вас нет соответствующих внешних ключей, вы не должны включать в себя titles, так как любые возможные несуществующие названия, на которые ссылается либо titleauthor или sales будут отфильтрованы в любом случае.)

Так окончательный запрос может выглядеть так:

SELECT 
    stores.state, 
    SUM(qty * price) 
FROM sales 
INNER JOIN stores ON sales.stor_id = stores.stor_id 
WHERE EXISTS (
    SELECT * 
    FROM authors a 
    INNER JOIN titelauthor ta ON a.au_id = ta.au_id 
    WHERE ta.titel_id = sales.title_id 
    AND a.state LIKE stores.state 
) 
GROUP BY 
    stores.state 
+0

Но разве вам не нужно включать заголовки, чтобы вы могли получить доступ к цене в инструкции select? Я забыл упомянуть, что цена указана из таблицы титров. –

+0

В этом случае да, 'титры' нужны. Тогда это первый вариант. –

0
SELECT DISTINCT authors.state, sum(qty*price) as total 
from authors 
JOIN titleauthor on titleauthor.au_id = authors.au_id 
JOIN titles on titles.title_id = titleauthor.title_id 
JOIN sales on sales.title_id = titles.title_id 
JOIN stores on stores.stor_id = sales.stor_id 
WHERE authors.state = stores.state 
group by authors.stat 
+0

Это не то значение, которое я ожидал получить. Я ожидал получить около 1704, что является суммой моего запроса –

+0

Какую ценность вы получили? –

+0

Я получил 'CA 3303.9000' –

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