Преобразуйте столбцы в строки в SQL [дубликат]

9
задан Handcraftsman 24 March 2013 в 18:15
поделиться

4 ответа

Я знаю, что вам нужно решение Oracle 9i, но Oracle 11 представляет PIVOT, который позволяет выполнять такие запросы, как:

select *
  from mb_test
 pivot ( max(fname ) as fname,
         max(lname) as lname
   for count in (1,2,3,4)
       )
order by id
;

, что дает:

 ID  1_fname  1_lname  2_fname  2_lname  3_fname  3_lname  4_fname  4_lname
20  abc      def      pqr      null     abc      xyz      xyz      xyz
21  abc      def      null     null     null     null     null     null
22  pqr      xyz      abc      abc      null     null     null     null

Не совсем то, что вам нужно. , но чрезвычайно полезен во многих случаях .... и почти стоит обновить только PIVOT и UNPIVOT

EDIT

Изменено, чтобы поместить fname и lname в отдельные столбцы

1
ответ дан 5 December 2019 в 01:42
поделиться
-1
ответ дан 5 December 2019 в 01:42
поделиться

Посмотрите на этот пример, тот же принцип, что и в ответе @Mike M. , но с настоящей реализацией Oracle:

  create table my_table (
    id    number,
    fname varchar2(255),
    lname varchar2(255),
    cnt   number
  );

  insert into my_table(cnt, fname, lname, id) values(1,'abc','def',20);
  insert into my_table(cnt, fname, lname, id) values(2,'pqr',''   ,20);      
  insert into my_table(cnt, fname, lname, id) values(3,'abc','xyz',20);  
  insert into my_table(cnt, fname, lname, id) values(4,'xyz','xyz',20);
  insert into my_table(cnt, fname, lname, id) values(1,'abc','def',21);
  insert into my_table(cnt, fname, lname, id) values(1,'pqr','xyz',22);
  insert into my_table(cnt, fname, lname, id) values(2,'abc','abc',22);

  select 
    tbl.id,
    min(decode(tbl.cnt, 1 , fname, null)) fname_1,
    min(decode(tbl.cnt, 1 , lname, null)) lname_1,
    min(decode(tbl.cnt, 2 , fname, null)) fname_2,
    min(decode(tbl.cnt, 2 , lname, null)) lname_2,
    min(decode(tbl.cnt, 3 , fname, null)) fname_3,
    min(decode(tbl.cnt, 3 , lname, null)) lname_3,
    min(decode(tbl.cnt, 4 , fname, null)) fname_4,
    min(decode(tbl.cnt, 4 , lname, null)) lname_4
  from 
    my_table tbl
  group by 
    tbl.id 
  order by 
    tbl.id  
  ;
1
ответ дан 5 December 2019 в 01:42
поделиться

Вот еще один, с которым вам может повезти. Мне нравится @ ThinkJet, но я не уверен, сколько стоит декодирование (больше или меньше, чем указано ниже.

SELECT
   T1.ID,
   T1.fname,
   T1.lname,
   T2.fname,
   T2.lname,
   T3.fname,
   T3.lname,
   T4.fname,
   T4.lname
FROM
      table T1
   LEFT JOIN
      table T2
   ON
         T1.ID = T2.ID
      AND T2.count = 2
   LEFT JOIN
      table T3
   ON
         T1.ID = T3.ID
      AND T3.count = 3
   LEFT JOIN
      table T4
   ON
         T1.ID = T4.ID
      AND T4.count = 4
WHERE
   T1.count = 1
2
ответ дан 5 December 2019 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: