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

Откуда: Milano
Сообщений: 57
Есть исходная таблица
TABELLA(
PRATICA NUMBER,
CONTROLLO VARCHAR2(10),
F_1 NUMBER,
F_2 NUMBER,
F_3 NUMBER)
Первичньій ключ по полям PRATICA и CONTROLLO.

В поле CONTROLLO набор разньіх абревиатур, около 80 значений. В принципе, точное их количество
заранее не известно, но для простотьі можно считать что их количество определено.

Например:
  PRATICA CONTROLLO   F_1     F_2     F_3
	1	AB	1	1	1
	1	BQ	2	2	2
	2	AB	3	3	3
	2	CW	4	4	4
	3	BQ	5	5	5
	3	CW	6	6	6

Нужно создать и заполнить таблицу
ALTRA_TABELLA
( PRATICA NUMBER,
F_1_AB NUMBER,
F_2_AB NUMBER,
F_3_AB NUMBER,
F_1_BQ NUMBER,
F_2_BQ NUMBER,
F_3_BQ NUMBER,
F_1_CW NUMBER,
F_2_CW NUMBER,
F_3_CW NUMBER
) с первичньім ключем по PRATICA
PRATICA	F_1_AB	F_2_AB	F_3_AB	F_1_BQ	F_2_BQ	F_3_BQ	F_1_CW	F_2_CW	F_3_CW
1	 1	 1	 1	  2	  2	  2			
2	 3	 3	 3	                           4	    4	     4			
3	 	 	 	  5	  5	5	   6	    6	     6


Т.е. получается, для каждого значения поля CONTROLLO в таблице TABELLA должно бьіть создано
и заполнено три поля в таблице ALTRA_TABELLA.

Задача бьі решалась просто, если бьі для каждого значения PRATICA бьіли бьі указаньі все
возможньіе значения CONTROLLO.
Т.е. бьіло бьі где-то так:
select pratica,
       max(decode(rn,1,f_1,null)) f_1_AB,
       max(decode(rn,1,f_2,null)) f_2_AB,
       max(decode(rn,1,f_3,null)) f_3_AB,
       max(decode(rn,2,f_1,null)) f_1_BQ,
       max(decode(rn,2,f_2,null)) f_2_BQ,
       max(decode(rn,2,f_3,null)) f_3_BQ,
       max(decode(rn,3,f_1,null)) f_1_CW,
       max(decode(rn,3,f_2,null)) f_2_CW,
       max(decode(rn,3,f_3,null)) f_3_CW
       from
       (
select t.pratica, t.f_1, t.f_2, t.f_3, row_number() over
       (partition by pratica order by controllo) rn

 from tabella t
 )
 group by pratica
Но как сделать, что-бьі оно правильно заполняло таблицу, пропуская те столбцьі в ALTRA_TABELLA, для которьіх
нету значений в CONTROLLO в таблице TABELLA??
9 сен 06, 12:53    [3114465]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
DelphiMen
Member

Откуда: Москва - Видное
Сообщений: 266
SELECT PRATICA,
       MAX(DECODE(RN,1,F_1,NULL)) F_1_AB,
       MAX(DECODE(RN,1,F_2,NULL)) F_2_AB,
       MAX(DECODE(RN,1,F_3,NULL)) F_3_AB,
       MAX(DECODE(RN,2,F_1,NULL)) F_1_BQ,
       MAX(DECODE(RN,2,F_2,NULL)) F_2_BQ,
       MAX(DECODE(RN,2,F_3,NULL)) F_3_BQ,
       MAX(DECODE(RN,3,F_1,NULL)) F_1_CW,
       MAX(DECODE(RN,3,F_2,NULL)) F_2_CW,
       MAX(DECODE(RN,3,F_3,NULL)) F_3_CW
  FROM (SELECT T.PRATICA, 
               T.F_1, 
               T.F_2, 
               T.F_3,
               DENSE_RANK() OVER(ORDER BY CONTROLLO) RN
          FROM TABELLA T)
GROUP BY PRATICA

---
In my beginning is my end. (T.S.Eliot)
9 сен 06, 13:32    [3114534]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
contr
Member

Откуда:
Сообщений: 1909
Почему не просто:
SQL> with tab as(
  2  select 1 PRATICA,	'AB' CONTROLLO,	1 F_1,	1 F_2,	1 F_3 from dual union all
  3  select 1,	'BQ',	2,	2,	2 from dual union all
  4  select 2,	'AB',	3,	3,	3 from dual union all
  5  select 2,	'CW',	4,	4,	4 from dual union all
  6  select 3,	'BQ',	5,	5,	5 from dual union all
  7  select 3,	'CW',	6,	6,	6 from dual
  8  )select PRATICA
  9       , max(decode(controllo,'AB',F_1,null)) F_1_AB
 10       , max(decode(controllo,'AB',F_2,null)) F_2_AB
 11       , max(decode(controllo,'AB',F_3,null)) F_3_AB
 12       , max(decode(controllo,'BQ',F_1,null)) F_1_BQ
 13       , max(decode(controllo,'BQ',F_2,null)) F_2_BQ
 14       , max(decode(controllo,'BQ',F_3,null)) F_3_BQ
 15       , max(decode(controllo,'CW',F_1,null)) F_1_CW
 16       , max(decode(controllo,'CW',F_2,null)) F_2_CW
 17       , max(decode(controllo,'CW',F_3,null)) F_3_CW
 18  from tab
 19  group by PRATICA;

   PRATICA     F_1_AB     F_2_AB     F_3_AB     F_1_BQ     F_2_BQ     F_3_BQ     F_1_CW     F_2_CW     F_3_CW
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          2          2          2                       
         2          3          3          3                                           4          4          4
         3                                           5          5          5          6          6          6

SQL> 
9 сен 06, 14:11    [3114583]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
DelphiMen
Member

Откуда: Москва - Видное
Сообщений: 266
contr
Почему не просто: ...

Потому что в вашем варианте надо явно указывать значения поля CONTROLLO.

---
In my beginning is my end. (T.S.Eliot)
9 сен 06, 14:14    [3114585]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Что-то мне подсказвает, что так делать не надо, разве чтобы однократно извратиться.
Когда названия колонок зависят от данных, причем бизнесовых, а не метаописания, то работать потом с этим нормальном можно либо клиентом только, либо с помощью динамического SQL.
9 сен 06, 14:16    [3114589]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
aguka
Member

Откуда: Milano
Сообщений: 57
DelphiMen
contr
Почему не просто: ...

Потому что в вашем варианте надо явно указывать значения поля CONTROLLO.

---
In my beginning is my end. (T.S.Eliot)


Спасибо большое, кажется то, что нужно!
Я сама не понимаю зачем им єто надо, ведь около 500 столбцов получается....
9 сен 06, 14:28    [3114609]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
aguka
Member

Откуда: Milano
Сообщений: 57
на самом деле, там динамически составлять запрос нужно будет, т.к. не известньі ни количество ни значения в поле controllo. Но єто легко, мне важнее бьіло понять, что надо применить функцию DENSE_RANK().
9 сен 06, 14:31    [3114615]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
contr
Member

Откуда:
Сообщений: 1909
DelphiMen
contr
Почему не просто: ...

Потому что в вашем варианте надо явно указывать значения поля CONTROLLO.

И что с того? Покажите хоть одно преимущество Вашего варианта. Обратите внимание на имена колонок.
Подумайте что даст Ваш вариант если в таблице образуется запись с "нештатным" значением controllo....
9 сен 06, 15:09    [3114669]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
aguka
Member

Откуда: Milano
Сообщений: 57
contr
DelphiMen
contr
Почему не просто: ...

Потому что в вашем варианте надо явно указывать значения поля CONTROLLO.

И что с того? Покажите хоть одно преимущество Вашего варианта. Обратите внимание на имена колонок.
Подумайте что даст Ваш вариант если в таблице образуется запись с "нештатным" значением controllo....


А как явно указать значение поля, если оно неизвестно заранее??

что значит, с "нештатньім" значением? например?
9 сен 06, 15:11    [3114674]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
contr
Member

Откуда:
Сообщений: 1909
aguka
А как явно указать значение поля, если оно неизвестно заранее??
Если бы имена полей не зависели от значений controllo, вариант с dense_rank был бы правильным вариантом :)
Но если Вам предстоит динамически генерировать запрос, включая имена полей, то dense_rank не дает никаких преимуществ.
aguka

что значит, с "нештатньім" значением? например?

'AA'
9 сен 06, 15:17    [3114688]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
2contr: Полкопейки и только потому, что суббота :-)
Зачем нам NULL в DECODE ? :-)
Наследство оригинального варианта ?
9 сен 06, 15:20    [3114698]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
DelphiMen
Member

Откуда: Москва - Видное
Сообщений: 266
dmidek
Наследство оригинального варианта ?

Ага. Максимально приближено к оригиналу. Лично я бы использовал CASE.

---
In my beginning is my end. (T.S.Eliot)
9 сен 06, 15:30    [3114717]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
DelphiMen
contr
Почему не просто: ...

Потому что в вашем варианте надо явно указывать значения поля CONTROLLO.



DelphiMen, Ваше лукавство безгранично :-)
На самом деле Ваше решение НАМНОГО больше зависит от исходных
данных, чем решение contr.

Представим себе, что нам нужно увидеть вначале BQ, потом AB , потом CW.
contr переставит декоды и все, а Ваше решение - тю- тю.
Вам тогда придется вставлять декод уже в order by
Оно просто заточено под алфавитный порядок следования столбцов и
поэтому является очень частным случаем решения подобных проблем.
9 сен 06, 17:35    [3114849]     Ответить | Цитировать Сообщить модератору
 Re: Подкиньте идею...  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116174
DelphiMen
Лично я бы использовал CASE.

Я бы нет. CASE- зачем он тут ? Для простого IF - DECODE ИМХО самое то.
9 сен 06, 17:36    [3114852]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить