2011-04-20 3 views
1

Предположим, что я имею 3 набор записей, какстроки для преобразования столбцов в SQL

Actno Sufix Amount 
000005 230  101000 
000005 535  100000 
000005 630  -500000 
000009 230  222000 
000009 535  120000 
000009 635  220000 

Мне нужно, чтобы отобразить его как

000005 230 101000 535 100000 630 -500000 
000009 230 222000 535 120000 635 220000 

Возможно ли это в SQL? Может ли кто-нибудь помочь мне в этом отношении?

+0

Только SQL? Или вы используете что-то вроде PHP для его отображения? – Dai

+0

нет ... только в sql ... – Sara

+0

Зачем вам это нужно? – hsz

ответ

0

Нет, это невозможно в SQL.

Это не то, для чего предназначен SQL; презентация не является работой SQL.

Если вы чувствуете, что вам нужны данные столбца в строки, то есть что-то о вашей идее организовать ваши данные, которые не подходят для реляционных баз данных. Вот где вы должны смотреть.

+0

благодарю вас за ответ. Я пробовал сначала в excel, pivoting и все .... но там также cudnt находят решение ... так думал об организации в sql .. – Sara

1

Если вы знаете, что у вас есть три регистрации для каждого Actno вы можете сделать это

;with cte as 
(
    select *, 
    row_number() over(partition by Actno order by Sufix) as rn 
    from [YourTable] 
) 
select 
    C.Actno, 
    min(C1.Sufix), 
    min(C1.Amount), 
    min(C2.Sufix), 
    min(C2.Amount), 
    min(C3.Sufix), 
    min(C3.Amount) 
from cte as C 
    inner join cte as C1 
    on C.Actno = C1.Actno and C1.rn = 1 
    inner join cte as C2 
    on C.Actno = C2.Actno and C2.rn = 2 
    inner join cte as C3 
    on C.Actno = C3.Actno and C3.rn = 3 
group by C.Actno 
order by C.Actno    
0

Если вы не возражаете, что ваши агрегированные строк на строки (и вы используете Oracle), я использовал чтобы сделать что-то вроде этого:

CREATE OR REPLACE FUNCTION APPEND_FIELD(sqlstr in varchar2, 
            sep in varchar2) 
return varchar2 is 
ret varchar2(4000) := ''; 
TYPE cur_typ IS REF CURSOR; 
rec cur_typ; 
field varchar2(4000); 
begin 
OPEN rec FOR sqlstr; 
LOOP 
    FETCH rec 
    INTO field; 
    EXIT WHEN rec%NOTFOUND; 
    ret := ret || field || sep; 
END LOOP; 
if length(ret) = 0 then 
    RETURN ''; 
else 
    RETURN substr(ret, 1, length(ret) - length(sep)); 
end if; 
end; 
/

select 
    actno, 
    sufix, 
    amount, 
    APPEND_FIELD('select sufix '''||' '||'''amount 
        from table tt 
       where tt.actno = '||t.actno||' and sufix != 230 ',' ') 
    from table t 
    where sufix=230; 

HTH

Смежные вопросы