Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Все в одны строчку  [new]
denU876
Guest
у меня Oracle 10
select  col1, col2, col3, col4, col5, col6, col7
from tablename

на выходе так:

gtrujk  4567  Moskva   Vasya Petrov   234-765-8765  Vasya.Petrov@someemail.com
lowgtr  4567  Piter    Kolya Ivanov   654-652-8769  Kolya.Ivanov@someemail.ru
jiuyop  4567  Kiev     Vasya Pupkin   609-345-6512  Vasya.Pupkin@someemail.com
...
...

Обычно бывает не больше 10-12 рекордов.
Как чтоб все это выходило всегда в 1 строчку?
Вот так:
gtrujk  4567  Moskva   Vasya Petrov   234-765-8765  Vasya.Petrov@someemail.com  lowgtr  4567  Piter    Kolya Ivanov   654-652-8769  Kolya.Ivanov@someemail.ru  jiuyop  4567  Kiev     Vasya Pupkin   609-345-6512  Vasya.Pupkin@someemail.com
7 ноя 10, 19:30    [9738532]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
на клиенте
7 ноя 10, 19:33    [9738537]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
denU876
Guest
bdsm_sql
на клиенте

?
7 ноя 10, 19:44    [9738566]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
( PIVOT либо MAX(DECODE(..)) ) по ROW_NUMBER()
а вообще это задача клиента.. такой вывод
7 ноя 10, 19:48    [9738572]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
denU876
Guest
ну PIVOT на oracle 10 никак

я пробую делать но не получается
хотелось бы увидеть образец кода для моего образца:

select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual
7 ноя 10, 20:05    [9738608]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
SELECT MAX(DECODE(rn), 1 col1),
SELECT MAX(DECODE(rn), 1 col2),
SELECT MAX(DECODE(rn), 1 col3),
SELECT MAX(DECODE(rn), 2 col1),
SELECT MAX(DECODE(rn), 2 col2),
SELECT MAX(DECODE(rn), 2 col3),
email
FROM (SELECT t.*, ROW_NUMBER() OVER(PARITITION BY email ORDER BY col1))
GROUP BY email
допилить..
7 ноя 10, 20:25    [9738657]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
ROW_NUMBER() OVER(PARITITION BY email ORDER BY col1) rn
7 ноя 10, 20:26    [9738660]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
denU876, не знаю зачем тебе это нужно и зачем вообще такое может быть нужно, но вот тебе функция возвращающая курсор на нужную тебе выборку. первый параметр - имя таблицы, второй - имя уникального столбца(необходима уникальность для джойна без перекрещиваний)
create or replace function as_one_row(p_tab_name in varchar2,p_col_name in varchar2) 
 return sys_refcursor is
  Result sys_refcursor;
  query varchar2(4000);
  cnt number;
  tab_name varchar2(4000):='(select * from '||p_tab_name||' order by '||p_col_name||')';
begin
  query:='select * from '||tab_name||' t1';
  execute immediate 'select count(1) from '||p_tab_name into cnt;
  for i in 2..cnt loop
    query:=query||' left join '||tab_name||' t'||to_char(i)||
                         ' on t'||to_char(i-1)||'.'||p_col_name||
                         '<'||
                         't'||to_char(i)||'.'||p_col_name;
  end loop;
  query:=query||' where rownum<=1';
  open result for query;
  return(Result);
end as_one_row;
7 ноя 10, 21:00    [9738767]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
denU876, в селектах использовать, например, так:
select as_one_row('ttt','col1') from dual; --курсор
select * from table(xmlsequence(as_one_row('ttt','col1')));--clob с xml
7 ноя 10, 21:20    [9738824]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
denU876
Guest
bdsm_sql,



SELECT MAX(DECODE(rn), 1 col1),
SELECT MAX(DECODE(rn), 1 col2),
SELECT MAX(DECODE(rn), 1 col3),
SELECT MAX(DECODE(rn), 2 col1),
SELECT MAX(DECODE(rn), 2 col2),
SELECT MAX(DECODE(rn), 2 col3),
email
FROM (SELECT t.*, ROW_NUMBER() OVER(PARITITION BY email ORDER BY col1)) rn
FROM (select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
      select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
      select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual)
GROUP BY email

Дает такую ошибку:
ORA-00909: INVALID NUMBER OF ARGUMENTS
7 ноя 10, 22:28    [9739031]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Присмотритесь к этим словам:
denU876
PARITITION
email
GROUP BY email
7 ноя 10, 22:34    [9739056]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
ага, опечатка.. PARTITION

и писать запрос лучше через
WITH t AS (select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
      select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
      select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual)
t.* в том (псевдо)запросе не случайно..
идея была дана, неужели сложно допилить?
7 ноя 10, 22:41    [9739083]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
denU876
Guest
bdsm_sql,

ну долбаю -- не идет:

WITH t AS (select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
      select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
      select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual)

SELECT MAX(DECODE(rn), 1 col1),
SELECT MAX(DECODE(rn), 1 col2),
SELECT MAX(DECODE(rn), 1 col3),
SELECT MAX(DECODE(rn), 2 col1),
SELECT MAX(DECODE(rn), 2 col2),
SELECT MAX(DECODE(rn), 2 col3),
email
FROM (SELECT t.*, ROW_NUMBER() OVER(PARTITION BY email ORDER BY col1)  from t ) rn
 
GROUP BY email
7 ноя 10, 23:39    [9739207]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Может ещё раз внимательно посмотрите мой пост - там три проблемы, а не одна. Или подумайте над тем, что же именно сейчас Вам оракл сказал и почему бы это?...
8 ноя 10, 00:31    [9739313]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
denU876
Guest
JaRo,

А на примере from dual можно показать?
8 ноя 10, 01:15    [9739390]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
denU876, вот функция которая будет возвращать готовый запрос:
create or replace function as_one_row_sql(p_tab_name in varchar2,p_col_name in varchar2) 
 return varchar2 is
  query varchar2(4000);
  cnt number;
  tab_name varchar2(4000):='(select * from '||p_tab_name||' order by '||p_col_name||')';
begin
  query:='select * from '||tab_name||' t1';
  execute immediate 'select count(1) from '||p_tab_name into cnt;
  for i in 2..cnt loop
    query:=query||' left join '||tab_name||' t'||to_char(i)||
                         ' on t'||to_char(i-1)||'.'||p_col_name||
                         '<'||
                         't'||to_char(i)||'.'||p_col_name;
  end loop;
  return(query||' where rownum<=1');
end as_one_row_sql;
Пример для таблицы ttt и столбца сортировки col7:
SELECT as_one_row_sql('ttt','col7')FROM dual
возвратит:
select * 
from 
       (select * from ttt order by col7) t1 
       left join (select * from ttt order by col7) t2 on t1.col7<t2.col7 
       left join (select * from ttt order by col7) t3 on t2.col7<t3.col7 
where rownum<=1
8 ноя 10, 03:31    [9739524]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
denU876, а тот вариант допиливается так

WITH t AS (select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
      select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
      select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual)

SELECT 
 MAX(DECODE(n, 1, col1)),
 MAX(DECODE(n, 1, col2)),
 MAX(DECODE(n, 1, col3)),
 MAX(DECODE(n, 2, col1)),
 MAX(DECODE(n, 2, col2)),
 MAX(DECODE(n, 2, col3))
FROM 
 (select rownum n,t.* from t)
GROUP BY 1
но в нем тоже надо динамически вставлять "MAX(DECODE(n, строка, столбец))," для каждого столбца для всех количеств строк, в моем же варианте кол-во столбцов знать не надо
8 ноя 10, 03:50    [9739531]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
xtender
denU876, а тот вариант допиливается так

WITH t AS (select 'gtrujk' col1,  '4567' col2,  'Moskva' col3,    'Vasya' col4,  'Petrov' col5,    '234-765-8765' col6,  'Vasya.Petrov@someemail.com' col7 from dual union all
      select 'lowgtr',  '4567',  'Piter',    'Kolya', 'Ivanov',   '654-652-8769',  'Kolya.Ivanov@someemail.ru' from dual union all
      select 'jiuyop',  '4567',  'Kiev',     'Vasya', 'Pupkin',   '609-345-6512',  'Vasya.Pupkin@someemail.com' from dual)

SELECT 
 MAX(DECODE(n, 1, col1)),
 MAX(DECODE(n, 1, col2)),
 MAX(DECODE(n, 1, col3)),
 MAX(DECODE(n, 2, col1)),
 MAX(DECODE(n, 2, col2)),
 MAX(DECODE(n, 2, col3))
FROM 
 (select rownum n,t.* from t)
GROUP BY 1
но в нем тоже надо динамически вставлять "MAX(DECODE(n, строка, столбец))," для каждого столбца для всех количеств строк, в моем же варианте кол-во столбцов знать не надо

не rownum а row_number() over()
n должен быть своим для каждой группы с опр. email
8 ноя 10, 08:35    [9739643]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
bdsm_sql

не rownum а row_number() over()
n должен быть своим для каждой группы с опр. email

почему это? ТС спрашивал обо всех строках, а не по каждому мылу в отдельности
8 ноя 10, 08:48    [9739663]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
xtender
bdsm_sql

не rownum а row_number() over()
n должен быть своим для каждой группы с опр. email

почему это? ТС спрашивал обо всех строках, а не по каждому мылу в отдельности

а.. а я не так понял. тогда ок
8 ноя 10, 09:45    [9739819]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
я думал в каждой группе по email не больше 10-12 будет
8 ноя 10, 09:45    [9739822]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
afvbfvhbav
Guest
denU876
у меня Oracle 10

Вот так попробуй
select wm_concat(concat_col)
  from (select  col1||' '||col2' '||col3||' '||col4||' '||col5||' '||col6||' '||col7 as concat_col
            from tablename)

P.S. Oracle под рукой нет, поэтому проверить на работоспособность не могу.
8 ноя 10, 10:10    [9739949]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 2006
У меня используется 2 варианта решения - 1 - собственная агрегатная ф-ция, конкатенирующая значения
гуглить так: oracle stragg, в старших версиях оракла оно вроде бы встроено, в младших - делается на коленке
читать - например тут
http://rudev.wordpress.com/2010/05/26/%d0%b0%d0%b3%d1%80%d0%b5%d0%b3%d0%b0%d1%82%d0%bd%d0%b0%d1%8f-%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d1%8f-stragg-%d1%81%d0%ba%d0%bb%d0%b0%d0%b4%d1%8b%d0%b2%d0%b0%d0%b5%d1%82-%d1%81%d1%82%d1%80%d0%be/
Или - писать ф-цию, принимающую на вход курсор....

С уважением, ВБ
8 ноя 10, 10:11    [9739955]     Ответить | Цитировать Сообщить модератору
 Re: Все в одны строчку  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
afvbfvhbav
denU876
у меня Oracle 10

Вот так попробуй
select wm_concat(concat_col)
  from (select  col1||' '||col2' '||col3||' '||col4||' '||col5||' '||col6||' '||col7 as concat_col
            from tablename)

P.S. Oracle под рукой нет, поэтому проверить на работоспособность не могу.

Зачем подзапрос? просто
select  wm_concat(col1||' '||col2' '||col3||' '||col4||' '||col5||' '||col6||' '||col7) as concat_col
            from tablename
И ТС просил столбцы по отдельности, а одну строку
8 ноя 10, 10:33    [9740080]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить