помогите составить запрос

andrewi
Дата: 25.09.2004 00:17:47
Есть таблица t со следующими полями:

id number
type number
data varchar2(100)

primary key: id, type
type может быть от 1 до 10

нужно получить выборку:
id
type
data1
data2

то есть, нужно поместить 2 разных data в два столбца в одной строке, если type равен 1 или 2, если же нет, то data2 остается равным NULL.



как сделать подскажите, пожалуйста.
eev
Дата: 25.09.2004 00:40:05
data 2 = null при каких условиях?
wildwind
Дата: 25.09.2004 00:41:38
select id, type, 
       decode(type, 1, data) data1,
       decode(type, 2, data) data2
  from t
Это?
eev
Дата: 25.09.2004 00:51:36
Меня смутило

" 1 или 2"
вобщем некоректо поставлен вопрос
eev
Дата: 25.09.2004 00:53:26
to wildwind
в вашем варианте

select id, type,
decode(type, 1, data,null) data1,
decode(type, 2, data,null) data2
from t
wildwind
Дата: 25.09.2004 00:57:59
Да, конечно, type забыл.
А вообще вопрос конечно неясный. Может ему нужно из двух строк сделать одну...
andrewi
Дата: 25.09.2004 01:06:01
автор
А вообще вопрос конечно неясный. Может ему нужно из двух строк сделать одну...


Да, нужно из двух строк сделать одну, но только если type в этих двух строках равно 1 и 2, в других случая ничего преобразовывать не нужно.

например
две строки
id = 1
type = 1
data = a
и
id = 1
type = 2
data = b
нужно преобразовать в одну,
а
id = 1
type = 1
data = a
и
id = 1
type = 3
data = b
не нужно.
wildwind
Дата: 25.09.2004 01:14:16
А из какой строки взять id и type?
И что делать если второй строки нет?
andrewi
Дата: 25.09.2004 01:49:02
wildwind
А из какой строки взять id и type?
И что делать если второй строки нет?


Объединять нужно только строки c одним id и с type 1,2
type написать 1

если есть type=1 то есть и строка с type=2, бизнес логика иного не предусматривает.
wildwind
Дата: 25.09.2004 04:04:45
Я знаю два способа: с использованием аналитических функций и без них. Оба довольно громоздки. С аналитическими функциями напишу позже, а второй способ зто вот такой изврат:
select id,
       decode(type, 2, 1, type)                          type,
       substr(min(to_char(type,'FM00')||data), 3)        data1,
       decode(decode(type, 2, 1, type), 
         1,  substr(max(to_char(type,'FM00')||data), 3),
             null                                        data2
  from t
 group by id, decode(type, 2, 1, type)
 order by id, decode(type, 2, 1, type)