问了这么多问题,感谢大家的回答,我大概有点明白了
但是自己努力了一上午还是搞不定,
还要麻烦大家,不好意思希望是动态语句既能够查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
*/
谢谢回帖!

解决方案 »

  1.   

    把我上次给你的语句的条件where 类号 = 'CA'去掉即可.
      

  2.   

    create table tb1(类号 varchar(10) , 列号 int, 行号 int, 数据 int) 
    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
    */
      

  3.   

    create table tb1(类号 varchar(10) , 列号 int, 行号 int, 数据 int) 
    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*/
      

  4.   

    觉得还是把tb3中的数据和tb1、tb2中的对照关系说一下。看了一会,没看明白
      

  5.   

    刚才用同学的电脑回复,居然用了他的号谢谢HEROWANG 一直以来的关注!!!tb3表是为了描述类型信息,tb1,tb2等等是描述数据信息
    根据一系列类型信息组合数据信息不知道我说的明白吗?谢谢回帖
      

  6.   


    我自己写了一下,不知道为什么报错
    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' 附近有语法错误。
    */
      

  7.   

    max(case when 列号 = 5 then 数据B else 0 end),
    from tb2 where 列号=5 group by 行号 ) 
    处多了一个‘,’
      

  8.   

    你给@sql1 赋值后,select @sql1  看一下,拼串拼的有问题!
      

  9.   


    谢谢,我改了一下,还是有点问题,
    能不能帮忙改一下
    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 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。
    */