Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
Мальчишка
Member

Откуда:
Сообщений: 328
Есть некий большой запрос, результаты которого нужно вывести в таблицу.
В довесок к выведенным данным нужно подсчитать итоги по части этой таблицы (обычно 1/100 части всех данных)

В связи с тем, что данных достаточно много (минимум 150-200к, максимум в 4-8 раз больше... Допустим 1,6 кк), не хотелось бы считать итоги по всей выборке с последующей фильтрацией

Подскажите, пожалуйста, люди добрые, наиболее оптимальные варианты таких запросов

Вот тестовый пример:
SELECT SUM(a), b, GROUPING_ID(a, b) GR_ID
  FROM (SELECT 1 a, '+' b
          FROM DUAL
        UNION ALL
        SELECT 2 a, '+' b
          FROM DUAL
        UNION ALL
        SELECT 1 a, '-' b
          FROM DUAL
        UNION ALL
        SELECT NULL a, '-' b FROM DUAL)
 GROUP BY GROUPING SETS(
                        (a, b) -- обычный вывод, без сортировки - выводим всё
                        , b -- сортировка по b - выводим только "+"
                        )
Из этого запроса нужно выбрать все результаты внутреннего запроса + итоги по столбцу а, где b = '+'

p.s.: with уже используется в запросе
10 июл 09, 20:20    [7403890]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
если в конце недели я всё верно понял, то выходит что-то подобное
SELECT CASE
	   	   WHEN GROUPING_ID(A, b) = 3 THEN SUM(CASE WHEN b = '+' THEN A END)
		   ELSE A
	   END A,
	   b,
	   GROUPING_ID(A, b) GR_ID
  FROM (SELECT 1 A, '+' b
          FROM DUAL
        UNION ALL
        SELECT 2 A, '+' b
          FROM DUAL
        UNION ALL
        SELECT 1 A, '-' b
          FROM DUAL
        UNION ALL
        SELECT NULL A, '-' b FROM DUAL
	   )
 GROUP BY GROUPING SETS(
                        (A, b) -- обычный вывод, без сортировки - выводим всё
                        , 1 -- сортировка по b - выводим только "+"
                        )
ABGR_ID
2+0
1+0
1-0
{null}-0
3{null}3
10 июл 09, 21:32    [7404033]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
Мальчишка
Member

Откуда:
Сообщений: 328
andreymx
если в конце недели я всё верно понял, то выходит что-то подобное
SELECT CASE
	   	   WHEN GROUPING_ID(A, b) = 3 THEN SUM(CASE WHEN b = '+' THEN A END)
		   ELSE A
	   END A,
	   b,
	   GROUPING_ID(A, b) GR_ID
  FROM (SELECT 1 A, '+' b
          FROM DUAL
        UNION ALL
        SELECT 2 A, '+' b
          FROM DUAL
        UNION ALL
        SELECT 1 A, '-' b
          FROM DUAL
        UNION ALL
        SELECT NULL A, '-' b FROM DUAL
	   )
 GROUP BY GROUPING SETS(
                        (A, b) -- обычный вывод, без сортировки - выводим всё
                        , 1 -- сортировка по b - выводим только "+"
                        )
AtBtGR_ID
2t+t0
1t+t0
1t-t0
{null}t-t0
3t{null}t3

Занятно... В понедельник проверю на производительность

Спасибо!
11 июл 09, 15:35    [7404945]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
Мальчишка,

Вы бы лучше более детально рассказали свою задачу.
т.к. лично я не уверен, что подсказал хорошее решение - это больше походит на решение пятничной задачки, чем на решение для рабочей системы.
11 июл 09, 20:44    [7405227]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
Мальчишка
Member

Откуда:
Сообщений: 328
andreymx
Мальчишка,

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


Запрос собирает данные из множества таблиц, сам по себе ничем не примечателен. То что в этом запросе сейчас необходимо - это четыре колонки: тип счета, номер счета, сумма счета, дата
Нужно вывести определённые итоги по полям - например по каждому из типов счетов вывести сумму за последнюю дату. Тоже ничего сложного.

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

Отсюда и возник вопрос в "красивом" решении....
13 июл 09, 10:46    [7407145]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный подсчет итогов параллельно с основным выводом данных  [new]
Мальчишка
Member

Откуда:
Сообщений: 328
up? :'(
13 июл 09, 12:33    [7407737]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить