求sql语句实现交叉表,内容详见内
我有个表如下:
A B C
x 01 aaa
x 02 bbb
x 03 ccc
y 01 ddd
y 03 eee
z 04 fff
……(此处B列的值不固定,也许还会有05/06/07/08……)
我要用sql语句得到下面的结果
A 01 02 03 04
x aaa bbb ccc (null)
y ddd (null) eee (null)
z (null) (null) (null) fff
……
请问怎么写?
问题点数:100、回复次数:6Top
1 楼rivery(river)回复于 2006-03-21 09:09:47 得分 20
declare @sql varchar(8000)
select @sql=''
select @sql=@sql+',['+B+']=max(case B when '''+B+''' then C end)'
from tablename
group by B
exec('select A'+@sql+' from tablename group by A')
Top
2 楼zlp321002(Life Is Good,Let's Shine)回复于 2006-03-21 09:12:32 得分 30
----SQL SEVER 2005(如下)----
--测试环境
Create table TA(A varchar(10), B varchar(10), C varchar(10))
insert into TA select 'x','01','aaa'
union all select 'x','02','bbb'
union all select 'x','03','ccc'
union all select 'y','01','ddd'
union all select 'y','03','eee'
union all select 'z','04','fff'
--动态SQL
DECLARE @PIT AS VARCHAR(200)
SET @PIT=''
SELECT @PIT=@PIT+',['+B+']' FROM TA
GROUP BY B
SET @PIT=STUFF(@PIT,1,1,'')
EXEC('
select * from Ta
PIVOT
(MAX(C)
FOR B IN ('+@PIT+')
) PT
')
--结果
/*
A 01 02 03 04
---------- ---------- ---------- ---------- ----------
x aaa bbb ccc NULL
y ddd NULL eee NULL
z NULL NULL NULL fff
(3 行受影响)
*/Top
3 楼rivery(river)回复于 2006-03-21 09:13:07 得分 50
--测试表
create table #(A varchar(20),B varchar(20),C varchar(20))
insert into #
select 'x','01','aaa' union
select 'x','02','bbb' union
select 'x','03','ccc' union
select 'y','01','ddd' union
select 'y','03','eee' union
select 'z','04','fff'
go
--处理语句
declare @sql varchar(8000)
select @sql=''
select @sql=@sql+',['+B+']=max(case B when '''+B+''' then C end)'
from #
group by B
exec('select A'+@sql+' from # group by A')
--删除测试表
drop table #
go
--结果
/*
x aaa bbb ccc NULL
y ddd NULL eee NULL
z NULL NULL NULL fff
*/Top
4 楼flyingbird_zz(飞鸟)回复于 2006-03-21 09:58:40 得分 0
zlp321002:你的那个语句我不能用,不知道是不是因为你那个是sql2005而我这是sql2000的缘故
另外几位的能用,但是生成的列名不是按01/02/03/04顺序排序,请问应该怎么解决?Top
5 楼flyingbird_zz(飞鸟)回复于 2006-03-21 09:59:55 得分 0
sorry,可以排序的,谢谢以上各位Top
6 楼zlp321002(Life Is Good,Let's Shine)回复于 2006-03-21 10:02:13 得分 0
--我的是SQL SERVER 2005支持的语法. SQL server 2000 中你添加个 order by B 即可.Top




