问了这么多问题,感谢大家的回答,我大概有点明白了
但是自己努力了一上午还是搞不定,
还要麻烦大家,不好意思希望是动态语句既能够查CA也能够查CB、CCif object_id('tb1')is not null drop table tb1
create table tb1(列号 int, 行号 int, 数据 int)
insert into tb1 values(1, 1 ,2343 )
insert into tb1 values(1, 2 ,993 )
insert into tb1 values( 1, 3 ,232)
insert into tb1 values( 1, 4 ,992 )
insert into tb1 values( 2, 1 ,234 )
insert into tb1 values( 2, 2 ,994 )
insert into tb1 values(2, 3 ,59 )
insert into tb1 values(2, 4 ,45 )
insert into tb1 values( 3, 1 ,53 )
insert into tb1 values( 3, 2 ,99 )
insert into tb1 values( 3, 3 ,454 )
insert into tb1 values( 4, 1 ,43534)
insert into tb1 values( 4, 2 ,99 )
insert into tb1 values( 4, 3 ,994 )
go
if object_id('tb2')is not null drop table tb2
create table tb2(列号 int , 行号 int , 数据A int , 数据B int)
insert into tb2 values( 5 ,1 ,15 , 11 )
insert into tb2 values( 5 ,2 ,26 , 12 )
insert into tb2 values(5 ,3 ,37 , 13 )
insert into tb2 values( 5 ,4 ,43 , 213)
insert into tb2 values( 6 ,1 ,44 , 123)
insert into tb2 values( 6 ,2 ,35 , 123)
insert into tb2 values( 6 ,3 ,26 , 123)
insert into tb2 values( 6 ,4 ,13 , 123)
insert into tb2 values( 7 ,1 ,53, 215 )
insert into tb2 values( 7 ,2 ,13 , 11 )
insert into tb2 values( 7 ,3 ,24 , 12 )
insert into tb2 values( 8 ,1 ,36 , 13 )
insert into tb2 values( 8 ,2 ,47 , 213)
insert into tb2 values(8 ,3 ,48 , 123)
go
if object_id('tb3')is not null drop table tb3
create table tb3(类号 varchar(10) , 列号 int , 序号 int,表名 varchar(10))
insert into tb3 values('CA' , 1 ,1 ,'tb1')
insert into tb3 values('CA' , 5 ,2 ,'tb2')
insert into tb3 values('CA' , 2 ,3 ,'tb1')
insert into tb3 values('CA' , 6 ,4 ,'tb2')
insert into tb3 values('CB' , 7 ,1 ,'tb1')
insert into tb3 values('CB' , 8 ,2 ,'tb1')
insert into tb3 values('CC' , 3 ,1 ,'tb2')
insert into tb3 values('CC' , 4 ,2 ,'tb2')
go
/*
CA
行号 列1数据1 列2数据2 列5数据A 列5数据B 列6数据A 列6数据B
----------- ----------- ----------- ----------- ----------- ----------- -----------
1 2343 234 15 11 44 123
2 993 994 26 12 35 123
3 232 59 37 13 26 123
4 992 45 43 213 13 123CB
行号 列3数据 列4数据
----------- ----------- -----------
1 53 43534
2 99 99
3 454 994
*/
谢谢回帖!
insert into tb1 values('CA', 1, 1 ,2343 )
insert into tb1 values('CA', 1, 2 ,993 )
insert into tb1 values('CA', 1, 3 ,23432)
insert into tb1 values('CA', 1, 4 ,992 )
insert into tb1 values('CA', 2, 1 ,234 )
insert into tb1 values('CA', 2, 2 ,994 )
insert into tb1 values('CA', 2, 3 ,5 )
insert into tb1 values('CA', 2, 4 ,45 )
insert into tb1 values('CB', 9, 1 ,53 )
insert into tb1 values('CB', 9, 2 ,99 )
insert into tb1 values('CB', 9, 3 ,454 )
insert into tb1 values('CB', 10, 1 ,43534)
insert into tb1 values('CB', 10, 2 ,99 )
insert into tb1 values('CB', 10, 3 ,994 )
go
create table tb2(类号 varchar(10) , 列号 int , 行号 int , 数据A int , 数据B int)
insert into tb2 values('CA' , 5 ,1 ,15 , 11 )
insert into tb2 values('CA' , 5 ,2 ,26 , 12 )
insert into tb2 values('CA' , 5 ,3 ,37 , 13 )
insert into tb2 values('CA' , 5 ,4 ,43 , 213)
insert into tb2 values('CA' , 6 ,1 ,44 , 123)
insert into tb2 values('CA' , 6 ,2 ,35 , 123)
insert into tb2 values('CA' , 6 ,3 ,26 , 123)
insert into tb2 values('CA' , 6 ,4 ,13 , 123)
insert into tb2 values('CC' , 7 ,1 ,53, 215 )
insert into tb2 values('CC' , 7 ,2 ,13 , 11 )
insert into tb2 values('CA' , 7 ,3 ,24 , 12 )
insert into tb2 values('CA' , 8 ,1 ,36 , 13 )
insert into tb2 values('CA' , 8 ,2 ,47 , 213)
insert into tb2 values('CA' , 8 ,3 ,48 , 123)
go--sql 2000动态
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
set @sql1 = 'select 类号 , 行号 '
select @sql1 = @sql1 + ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据 else 0 end) [列' + cast(列号 as varchar) + '数据]'
from (select distinct 列号 from tb1 where 类号 = 'CA') as a
set @sql1 = @sql1 + ' from tb1 group by 类号 , 行号'set @sql2 = 'select 类号 , 行号 '
select @sql2 = @sql2 + ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据A else 0 end) [列' + cast(列号 as varchar) + '数据A]'
+ ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据B else 0 end) [列' + cast(列号 as varchar) + '数据B]'
from (select distinct 列号 from tb2 where 类号 = 'CA') as a
set @sql2 = @sql2 + ' from tb2 group by 类号 , 行号'exec('select isnull(m.类号,n.类号) 类号, m.* , n.* from (' + @sql1 + ') m full join (' + @sql2 + ') n on m.类号 = n.类号 and m.行号 = n.行号 order by m.类号 , m.行号') drop table tb1, tb2/*
类号 类号 行号 列1数据 列2数据 类号 行号 列5数据A 列5数据B 列6数据A 列6数据B 列7数据A 列7数据B 列8数据A 列8数据B
---------- ---------- ----------- ----------- ----------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
CA CA 1 2343 234 CA 1 15 11 44 123 0 0 36 13
CA CA 2 993 994 CA 2 26 12 35 123 0 0 47 213
CA CA 3 23432 5 CA 3 37 13 26 123 24 12 48 123
CA CA 4 992 45 CA 4 43 213 13 123 0 0 0 0
CB CB 1 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CB CB 2 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CB CB 3 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CC NULL NULL NULL NULL CC 1 0 0 0 0 53 215 0 0
CC NULL NULL NULL NULL CC 2 0 0 0 0 13 11 0 0
*/
insert into tb1 values('CA', 1, 1 ,2343 )
insert into tb1 values('CA', 1, 2 ,993 )
insert into tb1 values('CA', 1, 3 ,23432)
insert into tb1 values('CA', 1, 4 ,992 )
insert into tb1 values('CA', 2, 1 ,234 )
insert into tb1 values('CA', 2, 2 ,994 )
insert into tb1 values('CA', 2, 3 ,5 )
insert into tb1 values('CA', 2, 4 ,45 )
insert into tb1 values('CB', 9, 1 ,53 )
insert into tb1 values('CB', 9, 2 ,99 )
insert into tb1 values('CB', 9, 3 ,454 )
insert into tb1 values('CB', 10, 1 ,43534)
insert into tb1 values('CB', 10, 2 ,99 )
insert into tb1 values('CB', 10, 3 ,994 )
go
create table tb2(类号 varchar(10) , 列号 int , 行号 int , 数据A int , 数据B int)
insert into tb2 values('CA' , 5 ,1 ,15 , 11 )
insert into tb2 values('CA' , 5 ,2 ,26 , 12 )
insert into tb2 values('CA' , 5 ,3 ,37 , 13 )
insert into tb2 values('CA' , 5 ,4 ,43 , 213)
insert into tb2 values('CA' , 6 ,1 ,44 , 123)
insert into tb2 values('CA' , 6 ,2 ,35 , 123)
insert into tb2 values('CA' , 6 ,3 ,26 , 123)
insert into tb2 values('CA' , 6 ,4 ,13 , 123)
insert into tb2 values('CC' , 7 ,1 ,53, 215 )
insert into tb2 values('CC' , 7 ,2 ,13 , 11 )
insert into tb2 values('CA' , 7 ,3 ,24 , 12 )
insert into tb2 values('CA' , 8 ,1 ,36 , 13 )
insert into tb2 values('CA' , 8 ,2 ,47 , 213)
insert into tb2 values('CA' , 8 ,3 ,48 , 123)
go--sql 2000动态
declare @sql1 varchar(8000)
declare @sql2 varchar(8000)
set @sql1 = 'select 类号 , 行号 '
select @sql1 = @sql1 + ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据 else 0 end) [列' + cast(列号 as varchar) + '数据]'
from (select distinct 列号 from tb1 where 类号 = 'CA') as a
set @sql1 = @sql1 + ' from tb1 group by 类号 , 行号'set @sql2 = 'select 类号 , 行号 '
select @sql2 = @sql2 + ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据A else 0 end) [列' + cast(列号 as varchar) + '数据A]'
+ ' , max(case when 列号 = ''' + cast(列号 as varchar) + ''' then 数据B else 0 end) [列' + cast(列号 as varchar) + '数据B]'
from (select distinct 列号 from tb2 where 类号 = 'CA') as a
set @sql2 = @sql2 + ' from tb2 group by 类号 , 行号'exec('select isnull(m.类号,n.类号) 类号, isnull(m.行号 ,n.行号) 行号, m.* , n.* from (' + @sql1 + ') m full join (' + @sql2 + ') n on m.类号 = n.类号 and m.行号 = n.行号 order by m.类号 , m.行号') drop table tb1, tb2/*类号 行号 类号 行号 列1数据 列2数据 类号 行号 列5数据A 列5数据B 列6数据A 列6数据B 列7数据A 列7数据B 列8数据A 列8数据B
---------- ----------- ---------- ----------- ----------- ----------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
CA 1 CA 1 2343 234 CA 1 15 11 44 123 0 0 36 13
CA 2 CA 2 993 994 CA 2 26 12 35 123 0 0 47 213
CA 3 CA 3 23432 5 CA 3 37 13 26 123 24 12 48 123
CA 4 CA 4 992 45 CA 4 43 213 13 123 0 0 0 0
CB 1 CB 1 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CB 2 CB 2 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CB 3 CB 3 0 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
CC 1 NULL NULL NULL NULL CC 1 0 0 0 0 53 215 0 0
CC 2 NULL NULL NULL NULL CC 2 0 0 0 0 13 11 0 0*/
根据一系列类型信息组合数据信息不知道我说的明白吗?谢谢回帖
我自己写了一下,不知道为什么报错
declare @sql1 varchar(8000)
set @sql1 = ''
select
@sql1 +=
(case 表名 when 'tb2'
then '(select 行号,
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据A else 0 end),
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据B else 0 end),
from ' +表名+' where 列号='+cast(列号 as varchar(10))+' group by 行号 )
union all '
when 'tb1'
then '(select 行号,
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据 else 0 end)
from ' +表名+' where 列号='+cast(列号 as varchar(10))+' group by 行号 )
union all '
else
' ' end)
from tb3 where 类号='CA'
order by 序号set @sql1=LEFT(@sql1,len(@sql1)-9)print @sql1 exec(@sql1)--
/*
(select 行号,
max(case when 列号 = 1 then 数据 else 0 end)
from tb1 where 列号=1 group by 行号 )
union all (select 行号,
max(case when 列号 = 5 then 数据A else 0 end),
max(case when 列号 = 5 then 数据B else 0 end),
from tb2 where 列号=5 group by 行号 )
union all (select 行号,
max(case when 列号 = 2 then 数据 else 0 end)
from tb1 where 列号=2 group by 行号 )
union all (select 行号,
max(case when 列号 = 6 then 数据A else 0 end),
max(case when 列号 = 6 then 数据B else 0 end),
from tb2 where 列号=6 group by 行号 )
Msg 156, Level 15, State 1, Line 7
关键字 'from' 附近有语法错误。
Msg 156, Level 15, State 1, Line 14
关键字 'from' 附近有语法错误。
*/
from tb2 where 列号=5 group by 行号 )
处多了一个‘,’
谢谢,我改了一下,还是有点问题,
能不能帮忙改一下
declare @sql1 varchar(8000)
set @sql1 = ''
select
@sql1 +=
(case 表名 when 'tb2'
then '(select 行号,
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据A else 0 end),
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据B else 0 end)
from ' +表名+' where 列号='+cast(列号 as varchar(10))+' group by 行号 )
union all '
when 'tb1'
then '(select 行号,
max(case when 列号 = ' + cast(列号 as varchar) + ' then 数据 else 0 end)
from ' +表名+' where 列号='+cast(列号 as varchar(10))+' group by 行号 )
union all '
else
' ' end)
from tb3 where 类号='CA'
order by 序号set @sql1=LEFT(@sql1,len(@sql1)-9)print @sql1 exec(@sql1)/*
(select 行号,
max(case when 列号 = 1 then 数据 else 0 end)
from tb1 where 列号=1 group by 行号 )
union all (select 行号,
max(case when 列号 = 5 then 数据A else 0 end),
max(case when 列号 = 5 then 数据B else 0 end)
from tb2 where 列号=5 group by 行号 )
union all (select 行号,
max(case when 列号 = 2 then 数据 else 0 end)
from tb1 where 列号=2 group by 行号 )
union all (select 行号,
max(case when 列号 = 6 then 数据A else 0 end),
max(case when 列号 = 6 then 数据B else 0 end)
from tb2 where 列号=6 group by 行号 )
Msg 205, Level 16, State 1, Line 1
使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。
*/