以前都是写的横向表,每个字段对应一个
现在纵向表,一条记录占几行...
以前是这样的
名字 概述 注意事项 
张三 男   随便使用现在纵表这样
张三  男
张三 随便使用这样该怎么写sql啊... 

解决方案 »

  1.   

    /*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 74  83  93
    李四 74  84  94
    想变成(得到如下结果): 
    姓名 课程 分数 
    ---- ---- ----
    李四 语文 74
    李四 数学 84
    李四 物理 94
    张三 语文 74
    张三 数学 83
    张三 物理 93
    --------------
    */create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
    insert into tb values('张三',74,83,93)
    insert into tb values('李四',74,84,94)
    go--SQL SERVER 2000 静态SQL。
    select * from
    (
     select 姓名 , 课程 = '语文' , 分数 = 语文 from tb 
     union all
     select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
     union all
     select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
    ) t
    order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end--SQL SERVER 2000 动态SQL。
    --调用系统表动态生态。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
    from syscolumns 
    where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
    order by colid asc
    exec(@sql + ' order by 姓名 ')--SQL SERVER 2005 动态SQL。
    select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。--------------------
      

  2.   


    create table Users
    (名字 nvarchar(20),
     概述 nvarchar(20),
     注意事项 nvarchar(1000),
     colA nvarchar(10),
     colB nvarchar(10))
    insert Users 
    select '张三', '男', '随便使用','ioui','5464' union all
    select 'AAA', '女', '随便使用1','rtret','789' union all
    select 'BBB', '女', '随便使用2','jhkn','24658' declare @sql as nvarchar(max)
    set @sql=''
    select @sql=@sql+' union all select 名字,'+[name]+' from Users' 
    from sys.columns where object_id=object_id('Users') and [name]<>'名字'
    set @sql='select * from ('+stuff(@sql,1,10,'')+') as t order by t.名字'
    print @sql
    exec(@sql)