powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможно ли сделать такое......
9 сообщений из 9, страница 1 из 1
Возможно ли сделать такое......
    #32121642
MIB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MIB
Гость
Подскажите кто знает, возможно ли в принципе одним запросом (или каким минимальным количеством запросов) средствами SQL+ сделать следующее:

есть большая таблица с полями:
1) номер контейнера
2) время (дата)
3) полный/пустой
4) тип (40/20 футов)
5) порт загрузки (импорт/внутренний)
6) порт выгрузки
......
......

требуется получить на выходе количество контейнеров по каждой комбинации полей.
Тоесть такую табличку:

время | порт выгрузки | импорт-пустой-20футов | импорт-полный-20футов | внутренний-пустой-20футов | внутренний-полный-20футов | импорт-пустой-40футов | импорт-полный-40футов | внутренний-пустой-40футов | внутренний-полный-40футов |

Каждая ячейка кроме время и порт выгрузки - это количество контейнеров соответствующее требованиям (наименование ячейки).

Кроме большого набора SQL запросов считающих каждое количество в отдельности ничего в голову не приходит. Но это слишком долго особенно когда выборка идет за месяц.
Хотелось бы как то это рационализировать.

Заранее спасибо.
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32121661
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esli Oracle8i/9i to da.
Ispol'zuetsya predlogenie (CASE + CUBE + ROLLUP).
ai script na table, ya opublikuu select stmt;
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32121740
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем проблема? Или я может чего не понимаю, но все очень просто и работать будет, помоему на любом Oracle

select "время", "порт выгрузки",
sum(decode(соответствующие условия)) ,
....
sum(decode(другие соответствующие условия))
from таблица
group by "время", "порт выгрузки"

несмог привести пример условия так как не до конца понял задания, особенно фразы
"Каждая ячейка кроме время и порт выгрузки - это количество контейнеров соответствующее требованиям (наименование ячейки). "
получается что 4 и 5 поля тоже кол-во?
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122073
MIB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MIB
Гость
SUM работать не будет.
Может я не так както написал, но считать надо не значения ячеек а просто строки таблицы соответсвующие условию.

например:

select count(*)
from table
where порт=порт выгрузки
and дата=yyyymmdd
and состояние=полный
and размер=40
and источник=порт загрузки

вот такого типа.
Но таких запросов надо 8 на каждую строку таблицы и * на количество дней за которые данный отчет составляется, а хочется так что бы сразу выдавалась табличка.

Использование group by дает возможность получить набор из 3х столбцов но зато за весь период те

время | порт выгрузки | любой из критериев

это конечно лучше т к надо повторят запрос всего 8 раз независимо от временного периода, но думаю что должно существовать решение позволяющее извлекать все это одним запросом.
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122203
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SUM работать будет, просто надо уметь складывать :)
select count(*)
полностью аналогичен
select sum(1)
это я и буду использовать

select sum(decode(порт,'порт выгрузки', decode(дата,'yyyymmdd',decode(состояние,'полный',decode(размер,40,decode(источник,'порт загрузки',1,0), 0), 0) 0),0)) "Первый критерий",
....
from таблица

Надеюсь остальные критерии не вызовут проблем
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122306
Прохожий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Послушай Oracle X-Pert'a. Он дело говорит. Даже больше того - если у тебя 9i, то можно использовать GROUPING SETS. Т.е. делаешь по принципу
select count(*)
from table
where порт=порт выгрузки
and дата=yyyymmdd
and состояние=полный
and размер=40
and источник=порт загрузки
GROUP BY GROUPING SETS
((дата, состояние, размер), (дата, состояние), (состояние, размер, источник), (размер, источник), .......);
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122528
MIB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MIB
Гость
to nick: спасибо,

select sum(decode(порт,'порт выгрузки', decode(дата,'yyyymmdd',decode(состояние,'полный',decode(размер,40,decode(источник,'порт загрузки',1,0), 0), 0) 0),0)) "Первый критерий",

работает нормально.
Есть еще один вопрос вдогонку:

условия выборки критериев не всегда представляют собой точное значение, а могут быть подстрокой, т е:

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

sum(decode(substr(источник,1,2),'RU',....

это работает нормально, но проблема в том что мне надо выбрать не по определенной стране а только внутренний или все остальные.
Попытка использовать:

sum(decode(instr(источник,'RU',1,2),'0',....

желаемого результата не принесла, выдаются цифры не соответствующие действительности.

Так собственно вопрос:

существует ли возможность проверять в decode на НЕ РАВНО?
Пробовал поставить not - ругается.

Кстати забыл написать ранее у меня Oracle 8.1.7.
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122605
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
decode(переменная,условие, ИСТИНА, ЛОЖЬ)
это же RTFM
...
Рейтинг: 0 / 0
Возможно ли сделать такое......
    #32122778
MIB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MIB
Гость
Да, я как то не понял с начала, все работает нормально
спасибо.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможно ли сделать такое......
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]