|
|
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
Подскажите кто знает, возможно ли в принципе одним запросом (или каким минимальным количеством запросов) средствами SQL+ сделать следующее: есть большая таблица с полями: 1) номер контейнера 2) время (дата) 3) полный/пустой 4) тип (40/20 футов) 5) порт загрузки (импорт/внутренний) 6) порт выгрузки ...... ...... требуется получить на выходе количество контейнеров по каждой комбинации полей. Тоесть такую табличку: время | порт выгрузки | импорт-пустой-20футов | импорт-полный-20футов | внутренний-пустой-20футов | внутренний-полный-20футов | импорт-пустой-40футов | импорт-полный-40футов | внутренний-пустой-40футов | внутренний-полный-40футов | Каждая ячейка кроме время и порт выгрузки - это количество контейнеров соответствующее требованиям (наименование ячейки). Кроме большого набора SQL запросов считающих каждое количество в отдельности ничего в голову не приходит. Но это слишком долго особенно когда выборка идет за месяц. Хотелось бы как то это рационализировать. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 06:33 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
Esli Oracle8i/9i to da. Ispol'zuetsya predlogenie (CASE + CUBE + ROLLUP). ai script na table, ya opublikuu select stmt; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 08:18 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
А в чем проблема? Или я может чего не понимаю, но все очень просто и работать будет, помоему на любом Oracle select "время", "порт выгрузки", sum(decode(соответствующие условия)) , .... sum(decode(другие соответствующие условия)) from таблица group by "время", "порт выгрузки" несмог привести пример условия так как не до конца понял задания, особенно фразы "Каждая ячейка кроме время и порт выгрузки - это количество контейнеров соответствующее требованиям (наименование ячейки). " получается что 4 и 5 поля тоже кол-во? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 10:08 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
SUM работать не будет. Может я не так както написал, но считать надо не значения ячеек а просто строки таблицы соответсвующие условию. например: select count(*) from table where порт=порт выгрузки and дата=yyyymmdd and состояние=полный and размер=40 and источник=порт загрузки вот такого типа. Но таких запросов надо 8 на каждую строку таблицы и * на количество дней за которые данный отчет составляется, а хочется так что бы сразу выдавалась табличка. Использование group by дает возможность получить набор из 3х столбцов но зато за весь период те время | порт выгрузки | любой из критериев это конечно лучше т к надо повторят запрос всего 8 раз независимо от временного периода, но думаю что должно существовать решение позволяющее извлекать все это одним запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:41 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
SUM работать будет, просто надо уметь складывать :) select count(*) полностью аналогичен select sum(1) это я и буду использовать select sum(decode(порт,'порт выгрузки', decode(дата,'yyyymmdd',decode(состояние,'полный',decode(размер,40,decode(источник,'порт загрузки',1,0), 0), 0) 0),0)) "Первый критерий", .... from таблица Надеюсь остальные критерии не вызовут проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 15:13 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
Послушай Oracle X-Pert'a. Он дело говорит. Даже больше того - если у тебя 9i, то можно использовать GROUPING SETS. Т.е. делаешь по принципу select count(*) from table where порт=порт выгрузки and дата=yyyymmdd and состояние=полный and размер=40 and источник=порт загрузки GROUP BY GROUPING SETS ((дата, состояние, размер), (дата, состояние), (состояние, размер, источник), (размер, источник), .......); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 16:47 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 06:10 |
|
||
|
Возможно ли сделать такое......
|
|||
|---|---|---|---|
|
#18+
decode(переменная,условие, ИСТИНА, ЛОЖЬ) это же RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 09:47 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32122073&tid=1991421]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
186ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 515ms |

| 0 / 0 |
