将查询结果分成多列
code name
----------- ----------
8 饶平五
9 江成
10 陈明
17 清水
20 灶强
23 伟雄
24 后面1号
26 老高
27 818
32 亚辉
33 亚中
34 迎满
38 炎松
(13 行受影响)
code name code1 name1 code2 name2
----------- ---------- ----------- ---------- ----------- ----------
8 饶平五 23 伟雄 33 亚中
9 江成 24 后面1号 34 迎满
10 陈明 26 老高 38 炎松
17 清水 27 818 NULL NULL
20 灶强 32 亚辉 NULL NULL
警告: 聚合或其他 SET 操作消除了 Null 值。
(5 行受影响)
今天在论坛上 看到的就是将查询的结果集分为多列,<color='red'>注意这里是列固定,行不固定</color>
这就应该有点思路了,既然列固定了,就得求出需要多少行
首先给每行加上连续的ID(这里采用sql2000的子查询方法)
SELECT num=(SELECT COUNT(1) FROM tb WHERE code<t1.code )+1,*
FROM tb AS t1
/*
num code name
----------- ----------- ----------
1 8 饶平五
2 9 江成
3 10 陈明
4 17 清水
5 20 灶强
6 23 伟雄
7 24 后面1号
8 26 老高
9 27 818
10 32 亚辉
11 33 亚中
12 34 迎满
13 38 炎松
*/
总共有13条记录,已经固定3列,所以要分13/3=4·····1即需要5行,
这里突然想起这有点类似web中的分页,假使有M条数据,每页N条则需要分多少页,显然pageCount=(M%N==0)?(M/N):(M/N+1)很符合逻辑的答案
这个方案需要一个%运算,一个判断运算,一个除法,而乘除、取余要比加减法效率低太多。 如果用另外一种算法,可以减少一次乘除(取余),而且不用if..else...判断,当然也不用三元去运算符
那么就会用到小学的数学知识,具体在哪本书哪一页忘记了,有兴趣的可以查查pagecount=(M+N-1)/N=(M-1)/N+1
那么这里这种就可以由这种写法
select case when count(1)%3 = 0 then count(1)/3 else count(1)/3 + 1 end cnt from tb
变成:
SELECT cnt=(COUNT(1)+3-1)/3 FROM tb
上面为求需要多少行数据,求这多少行的目的主要是为了每一条数据要显示在那一列,例如江成老高行号为(8-1)/5=1,则老高显示在第二列
则整体代码为
select max(case when (px - 1)/n.cnt = 0 then code else null end) code,
max(case when (px - 1)/n.cnt = 0 then name else null end) name,
max(case when (px - 1)/n.cnt = 1 then code else null end) code1,
max(case when (px - 1)/n.cnt = 1 then name else null end) name1,
max(case when (px - 1)/n.cnt = 2 then code else null end) code2,
max(case when (px - 1)/n.cnt = 2 then name else null end) name2
FROM (
select t.* , px = (select count(1) from tb where code < t.code) + 1 from tb t ) m,
(select case when count(1)%3 = 0 then count(1)/3 else count(1)/3 + 1 end cnt from tb )n
group by (px - 1)%n.cnt
--这里(px - 1)%n.cnt
--按照行分组
浙公网安备 33010602011771号