表A:
------------------
   InfoID    FName   FContext
     1       name1    c1
     1       name2    c2
     1       name3    c3
     2       name1    c4
     3       name4    c5
------------------
转换成
表B:
---------------------
    InfoID   name1   name2  name3  name4
     1         c1      c2     c3     null
     2         c4      null   null   null
     3         null     null   null    c5
---------------------
sql的交叉查询无法实现,存储过程用不了(Access数据库)
问题:sql能实现吗?
最终的目的是为了绑定在一个DataGrid上,格式是按照表B的格式绑定出来

解决方案 »

  1.   


    http://topic.csdn.net/u/20110620/15/bec4adee-ebd6-40c7-88f6-250050f79680.htmlhttp://www.google.com.hk/#hl=zh-CN&newwindow=1&safe=strict&biw=1280&bih=828&q=sql+%E8%A1%8C%E8%BD%AC%E5%88%97&oq=sql+%E8%A1%8C%E8%BD%AC%E5%88%97&aq=f&aqi=&aql=&gs_sm=e&gs_upl=0l0l5l688l0l0l0l0l0l0l0l0ll0l0&fp=7c9566161d614731
      

  2.   

    我的FContext是文本型的不是数值型,不能用group by 
      

  3.   

    要是我我就在程序里组织了 主要是sql不熟 ~ 
      

  4.   

    再补充下,FName是动态添加的,而不是固定死的,text -文本型
              FContext也是动态添加的,text 文本型
              InfoID动态添加,int型
      

  5.   

    在linq里面,文本也可以当作分组的key。事实上一切东西都可以。因为linq是用HashCode作为比较的,而HashCode是所有对象/类型都有的。至于sql的做法,我给你转sql板进一步讨论,思路是一样的。
      

  6.   

    写sql的原因是因为绑定datagrid时方便,只要datagrid。datasource=dt就可以了
    在程序里面组织的话需要用几个循环,效率太低了
      

  7.   

    linq不熟悉,我需要sql~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  8.   


    select InfoID,
      max(case FName  when 'name1' then FContext else null end)  name1,
      max(case FName  when 'name2' then FContext else null  end) name2,
      max(case FName  when 'name3' then FContext else null  end) name3,
      max(case FName  when 'name3' then FContext else null  end) name4
    from A
    group by InfoID 
      

  9.   


    /*
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
      

  10.   

    FName动态的,FContext动态添加的,你这样是固定死的,不符合要求~
      

  11.   

    /*
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华 
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------/*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    姓名 语文 数学 物理 平均分 总分 
    ---- ---- ---- ---- ------ ----
    李四 74   84   94   84.00  252
    张三 74   83   93   83.33  250
    */--SQL SERVER 2000 静态SQL。
    select 姓名 姓名,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理,
      cast(avg(分数*1.0) as decimal(18,2)) 平均分,
      sum(分数) 总分
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL。
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m , 
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名')drop table tb    ------------------
    ------------------/*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 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。--------------------
    /*
    问题:在上述的结果上加个平均分,总分,得到如下结果:
    姓名 课程   分数
    ---- ------ ------
    李四 语文   74.00
    李四 数学   84.00
    李四 物理   94.00
    李四 平均分 84.00
    李四 总分   252.00
    张三 语文   74.00
    张三 数学   83.00
    张三 物理   93.00
    张三 平均分 83.33
    张三 总分   250.00
    ------------------
    */select * from
    (
     select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb 
     union all
     select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
     union all
     select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
     union all
     select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
     union all
     select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
    ) t
    order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb
      

  12.   


    select InfoID,
      max(case FName  when 'name1' then FContext else null end)  name1,
      max(case FName  when 'name2' then FContext else null  end) name2,
      max(case FName  when 'name3' then FContext else null  end) name3,
      max(case FName  when 'name4' then FContext else null  end) name4
    from A
    group by InfoID 
      

  13.   

    还是没有完成需求。
    FName 动态添加的
    FContext 动态添加的。不要固定死的sql
      

  14.   

    use hell
    go
    drop table table_7
    create table table_7
    (
      id int not null
    )
    declare @i int
    declare @j int
    declare @name nchar(7)
    set @name=''
    declare names_cursor cursor
    local scroll static 
    for
      select distinct name from table_6
      open names_cursor
    set @i=(select count (distinct name )from table_6)
    set @j=1
    while @j<=@i
    begin
    fetch next from names_cursor
      into @name
    exec ('alter table table_7 add  '+ @name +'nchar(10) null')
    set @j+=1
    end
    close names_cursor
    go
    use hell
    go
    declare @name nchar(5)
    declare @id int 
    declare @rows int
    declare @count int
    declare @text nchar(10)
    declare @idname nchar(2)
    declare data_cursor cursor
    local scroll static
    for
       select * from table_6
       open data_cursor
    set @rows=(select count(*)from table_6)
    set @count=1
    while @count<=@rows
    begin
    fetch next from data_cursor
       into @id,@name,@text
    set @idname=convert(nchar(2),@id)
    if (@id not in (select distinct id from table_7 ))
    begin
    exec ('insert into table_7 (id,'+@name+') values(  '+@idname+','''+@text+''')')
    end
    else
    begin
    exec ('update table_7 set '+@name+'='''+@text+''' where id='+@idname)
    end
    set @count+=1
    end
    go这是我用楼主的例子写的,我这里运行可以,完全是动态的,应该符合楼主的要求
      

  15.   

    access数据库貌似不能使用这条sql
    看来还得在程序那里折腾。
      

  16.   

    http://topic.csdn.net/u/20110826/22/86967a58-1438-414b-9868-a7757621e450.html
    程序里解决的办法,已有高手解决了~有兴趣的可以去看看。这里马上结贴。谢谢各位的帮忙,分不多,没得到的对不起了。