请问:sql 语句分栏写法

yinzhiw 2005-07-11 11:04:39
请问:sql 语句分栏写法
现有一表 test (A)
有如下数据
A  
------
a
b
c
d
e
f
g
h
i
j

要就得出下面的结果(分3列)
a e h
b f i
c g j
d
上面结果是这样得来的,要求按第一栏排列完成后,排列第二栏,再排列第三栏(也就是先栏后列的意思)
如:上面有10条记录,那么可以分成10/3行, 如果不能整除则加1表示是有多少行
上例子则是10/3+1 = 4 行

如果Sql不行的话,程储过程也可以
谢谢!!
...全文
212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rolandzhang 2005-07-12
  • 打赏
  • 举报
回复
bzszp巧妙啊,学习
沝林 2005-07-12
  • 打赏
  • 举报
回复
SQL> select * from test
2 /

A
----------
a
b
c
d
e
f
g
h
j
i

已选择10行。

已用时间: 00: 00: 00.00
SQL> select a,a1,a2 from
2 (select a,cnt,lead(a,ceil(cnt/3)) over(order by a) a1,
3 lead(a,ceil(cnt/3)*2) over(order by a) a2
4 from (select a,count(*) over() cnt from test)
5 ) where rownum <=ceil(cnt/3)
6 /

A A1 A2
---------- ---------- ----------
a e i
b f j
c g
d h

已用时间: 00: 00: 00.00
bzszp 2005-07-11
  • 打赏
  • 举报
回复
拆成3个小表
进行外联接
yinzhiw 2005-07-11
  • 打赏
  • 举报
回复
To:
bzszp(SongZip)
谢谢你的回复,不过你的结果好像不满足我的要求
yinzhiw 2005-07-11
  • 打赏
  • 举报
回复
不好意思
上面的结果应该是这样的:
a e i
b f j
c g
d  h
bzszp 2005-07-11
  • 打赏
  • 举报
回复
例如:

SQL> select * from t;

NAME
----------
a
b
c
d
e
f
g

已选择7行。

已用时间: 00: 00: 00.40
SQL> select max(decode(mod(rm,3),1,name,'')) col1,
2 max(decode(mod(rm,3),2,name,'')) col2,
3 max(decode(mod(rm,3),0,name,'')) col3
4 from (
5 select name,row_number() over(order by name) rm from t) tt
6 group by trunc((rm-1)/3);

COL1 COL2 COL3
---------- ---------- ----------
a b c
d e f
g

已用时间: 00: 00: 00.20
SQL>
heyixiang 2005-07-11
  • 打赏
  • 举报
回复
我居然把ceil()这个函数给忘记了

-_!!
bzszp 2005-07-11
  • 打赏
  • 举报
回复
SQL> delete from t where name='k';

已删除 1 行。

已用时间: 00: 00: 00.10
SQL> select tb1.name name1,tb2.name name2,tb3.name name3 from (
2 select id,name from (select rownum id,name from t) t1,
3 (select ceil(count(*)/3) num from t) tt where t1.id<=tt.num
4 ) tb1,
5 (
6 select id-tt.num id,name from (select rownum id,name from t) t1,
7 (select ceil(count(*)/3) num from t) tt where t1.id between tt.num+1 and tt.num*2
8 ) tb2,
9 (
10 select id-tt.num*2 id,name from (select rownum id,name from t) t1,
11 (select ceil(count(*)/3) num from t) tt where t1.id >tt.num*2
12 ) tb3
13 where tb1.id=tb2.id and tb1.id=tb3.id(+);

NAME1 NAME2 NAME3
---------- ---------- ----------
a e i
b f j
c g
d h

已用时间: 00: 00: 00.40
SQL>
bzszp 2005-07-11
  • 打赏
  • 举报
回复
SQL> select * from t;

NAME
----------
a
b
c
d
e
f
g
h
i
j
k

已选择11行。

已用时间: 00: 00: 00.71
SQL> select tb1.name name1,tb2.name name2,tb3.name name3 from (
2 select id,name from (select rownum id,name from t) t1,
3 (select ceil(count(*)/3) num from t) tt where t1.id<=tt.num
4 ) tb1,
5 (
6 select id-tt.num id,name from (select rownum id,name from t) t1,
7 (select ceil(count(*)/3) num from t) tt where t1.id between tt.num+1 and tt.num*2
8 ) tb2,
9 (
10 select id-tt.num*2 id,name from (select rownum id,name from t) t1,
11 (select ceil(count(*)/3) num from t) tt where t1.id >tt.num*2
12 ) tb3
13 where tb1.id=tb2.id and tb1.id=tb3.id(+);

NAME1 NAME2 NAME3
---------- ---------- ----------
a e i
b f j
c g k
d h

已用时间: 00: 00: 00.40
SQL>
heyixiang 2005-07-11
  • 打赏
  • 举报
回复
上面4这个值由select trunc(count(*)/3)+decode(mod(count(*),3),0,0,1) from henry_test得到
heyixiang 2005-07-11
  • 打赏
  • 举报
回复
create table henry_test(A varchar(10));
Insert into henry_test values ('a');
Insert into henry_test values ('b');
Insert into henry_test values ('c');
Insert into henry_test values ('d');
Insert into henry_test values ('e');
Insert into henry_test values ('f');
Insert into henry_test values ('g');
Insert into henry_test values ('h');
Insert into henry_test values ('i');
Insert into henry_test values ('j');

SQL> select * from v_henry_test;

A
----------
a
b
c
d
e
f
g
h
i
j

10 rows selected



SQL> select a,decode(rownum/4-trunc(rownum/4),0,1,rownum/4-trunc(rownum/4))*4 行,
2 trunc(rownum/4+(4-1)/4) as 列
3 from henry_test
4 ;

A 行 列
---------- ---------- ----------
a 1 1
b 2 1
c 3 1
d 4 1
e 1 2
f 2 2
g 3 2
h 4 2
i 1 3
j 2 3

10 rows selected


在根据上面的行列位置重新生成表。
keliu8866 2005-07-11
  • 打赏
  • 举报
回复
test这个表有两个字段rowid(类型自动增长字段,从1开始,步长1),rowid1(随便)
这里行数为3(rowcount),栏数为3(colcount)
在9条记录内是正确的,换句话说rowid是1-9时是正确的,不过注意不能删除记录,否则结果是错误的

select a.rowid as col1,b.rowid as col2,c.rowid as col3 from test a left join test b on b.rowid=a.rowid+1*rowcount left join test c on c.rowid=a.rowid+2*rowcount where a.rowid<=rowcount
yinzhiw 2005-07-11
  • 打赏
  • 举报
回复
》》拆成3个小表
进行外联接

这样好像不好做把

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧