Подведение итогов запроса - PullRequest
1 голос
/ 15 марта 2012

Хорошо, я знаю, что должен дать этот запрос, он должен дать сумму итогового результата, который он выводит.У меня проблемы с выяснением, как суммировать результаты.База данных, которую я использую, является базой данных издателей

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

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

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

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

Вы можете избежать дубликатов, введя полусоединение в форме предиката 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 голосов
/ 15 марта 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...