sql中的行到列转换

时间:2011-04-20 09:53:39

标签: 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中吗?有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分: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              

答案 1 :(得分:0)

不,这在SQL中是不可能的。

它也不是SQL的用途;演示文稿不是SQL的工作。

如果您认为需要将列数据放入行中,那么您的想法就是组织不适合关系数据库的数据。那就是你应该看的地方。

答案 2 :(得分: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

相关问题