Как сделать такой хитрый select?

badhabit
Дата: 24.11.2009 10:17:06
Добрый день. У меня в БД есть таблица вида:
my_datenameparam1param2param3param4param5
01.04.09"name1" 1 2 0 0 3
01.04.09"name2" 0 4 5 0 6
01.04.09 "name3" 7 0 0 0 8
01.05.09 "name1" 9 10 11 0 0
01.05.09 "name2" 12 13 0 0 0
01.05.09 "name3" 14 15 0 0 0


И надо например для name1 сделать такую табличку:
01.04.09 01.05.09
name1 param1 1 9
param2 2 10
param3 0 11
param5 3 0


для name2 и name3 соответственно такие
01.04.09 01.05.09
name2 param1 0 12
param2 4 13
param3 5 0
param5 6 0


01.04.09 01.05.09
name3 param1 7 14
param2 0 15
param5 8 0


т.е. какбы "перевернуть" табличку для каждого name и не выводить пустые строки (т.е. те у которых какой-нибудь param за все периоды равен 0). Помогите плз, а то что-то совсем голову сломал...
mds_world
Дата: 24.11.2009 10:25:59
Перекрестный запрос. Смотрите хелп и поиск по форуму.
Rivkin Dmitry
Дата: 24.11.2009 10:26:05
badhabit,
ключевое слово для поиска: перекрестный запрос (crosstab)
badhabit
Дата: 26.11.2009 13:39:04
Добрый день. Почитал о перекрестных запросах - вроде то что нужно. Только загвоздка в том, что во всех примерах за заголовки строк берут значения одного поля исходной таблицы, а у меня таких полей 5 и заголовками должны не значения, а именно названия этих полей. Надеюсь понятно высказал...
Подскажите хотя бы примерно, как поступить в моём случае.
отакота
Дата: 26.11.2009 13:43:37
badhabit
Добрый день. Почитал о перекрестных запросах - вроде то что нужно. Только загвоздка в том, что во всех примерах за заголовки строк берут значения одного поля исходной таблицы, а у меня таких полей 5 и заголовками должны не значения, а именно названия этих полей. Надеюсь понятно высказал...
Подскажите хотя бы примерно, как поступить в моём случае.
можно сначала превратить 5 полей в одно (используя union all) одновременно добавив туда и столбец с назанием поля, а потом для этого всего сделать transform
badhabit
Дата: 26.11.2009 14:06:02
отакота
можно сначала превратить 5 полей в одно (используя union all) одновременно добавив туда и столбец с назанием поля, а потом для этого всего сделать transform

Может я что-то не понимаю, но мне не надо объединять все поля param[1-5] в одно поле, мне надо чтобы в итоговых таблицах заголовками строк были поля param1, param2, param3, param4, param5.
отакота
Дата: 26.11.2009 14:09:57
так они и будут там
transform min(param)
select name, parname from (
select my_date, name, param1 as param, "param1" as parname from t union all
select my_date, name, param2 as param, "param2" as parname from t union all
select my_date, name, param3 as param, "param3" as parname from t union all
select my_date, name, param4 as param, "param4" as parname from t union all
select my_date, name, param5 as param, "param5" as parname from t)
where not param = 0
group by name, parname
order by name, parname
pivot my_date
отакота
Дата: 26.11.2009 14:20:51
вдогонку ряд замечаний по результату приведенного запроса в сравнении с тем видом результата что у вас:
- имена столбцов с датами не смогут содержать точку (не бывает)
- в поле name пустых значений не будет (если что, убрать повторы можно например в отчете)
- если в итоговых ячейках вместо пустых значений нужны нули, добавьте к min обертку nz с нулем.
- ну и, понятно, если надо получить отдельно подтаблицу для одного значения name, то дополнительно добавить в where соответсвующее условие отбора
badhabit
Дата: 26.11.2009 14:49:20
отакота
вдогонку ряд замечаний по результату приведенного запроса в сравнении с тем видом результата что у вас:
- имена столбцов с датами не смогут содержать точку (не бывает)
- в поле name пустых значений не будет (если что, убрать повторы можно например в отчете)
- если в итоговых ячейках вместо пустых значений нужны нули, добавьте к min обертку nz с нулем.
- ну и, понятно, если надо получить отдельно подтаблицу для одного значения name, то дополнительно добавить в where соответсвующее условие отбора

Большое человеческое спасибо!!! :) Я б долго мучился пока бы этот запрос "родил" :)
badhabit
Дата: 26.11.2009 14:50:32
теперь осталось только понять как он работает :)