Вложенный запрос - поиск лучшего решения - PullRequest
3 голосов
/ 11 августа 2011

Рассмотрим заявку на продажу, в которой у нас есть две таблицы SALES и INTERNAL_SALES.

  • Таблица "SALES" указывает количество транзакций, совершенных каждым продавцом вне компании.
  • Таблица«INTERNAL_SALES» указывает число транзакций, совершенных каждым торговым представителем внутри компании, другому торговому представителю.

SALES Table : каждая дата имеет одну запись для каждого торгового представителя, даже еслитранзакции равны нулю.

id |  day          | sales_person | number_of_transactions
1  | 2011-08-01    | Tom          | 1000
2  | 2011-08-01    | Ben          | 500
3  | 2011-08-01    | Anne         | 1500
4  | 2011-08-02    | Tom          | 0
5  | 2011-08-02    | Ben          | 800
6  | 2011-08-02    | Anne         | 900
7  | 2011-08-03    | Tom          | 3000
8  | 2011-08-03    | Ben          | 0
9  | 2011-08-03    | Anne         | 40

INTERNAL_SALES Таблица : в этой таблице регистрируются только те транзакции, которые фактически были выполнены между продавцами.

id | day        | sales_person_from | sales_person_to | number_of_transactions
 0 | 2011-08-01 | Tom               | Ben             | 10
 1 | 2011-08-01 | Tom               | Anne            | 20
 2 | 2011-08-01 | Ben               | Tom             | 50
 3 | 2011-08-03 | Anne              | Tom             | 30
 4 | 2011-08-03 | Anne              | Tom             | 30

Теперь проблема заключается всоставлять общее количество транзакций каждого продавца ежедневно.Вот как я это сделал:

SELECT day, sales_person, sum(num_transactions) from
(
  SELECT day, sales_person, number_of_transactions As num_transactions FROM sales;
  UNION
  SELECT day, sales_person_from As sales_person, sum(number_of_transactions) As num_transactions FROM internal_sales GROUP BY day, sales_person_from;
)
GROUP BY day, sales_person;

Это слишком медленно и выглядит некрасиво.Я ищу лучшее решение.Кстати, база данных, используемая в Oracle, и я не имею никакого контроля над базой данных, кроме того, что я могу выполнять запросы к ней.

1 Ответ

7 голосов
/ 11 августа 2011

Нет необходимости агрегировать дважды, и оператор объединения обычно выполняет неявную уникальную сортировку, которая, опять же, не требуется в вашем случае.

SELECT day, sales_person, sum(num_transactions) from
(
    SELECT day, sales_person, number_of_transactions As num_transactions FROM sales;
    UNION ALL 
    SELECT day, sales_person_from, number_of_transactions FROM internal_sales;
)
GROUP BY day, sales_person;

Удаление промежуточной агрегации и уникальной сортировки должно немного помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...