例如:
fID           fUserName          fBookName
1             张三               《邓论》
2             张三               《毛概》
3             张三               《马哲》
4             李四               《邓论》
5             李四               《政经》
6             王五               《毛概》显示成fID    fUserName   fBookName      fID     fUserName    fBookName   fID     fUserName   fBookName
1       张三       《邓论》        1       张三         邓论》      1       张三       《邓论》就算是相同的值也要另外显示成一列。要求有列名。提取数据集中的前三条。通过一个ID来查询数据。 急啊。拜托啦!!!

解决方案 »

  1.   


    --> 数据库版本:
    --> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
    --> 测试数据:[TB]
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[TB]') 
    AND type in (N'U')) 
    DROP TABLE [TB]
    GO---->建表
    create table [TB]([fID] int,[fUserName] varchar(4),[fBookName] varchar(8))
    insert [TB]
    select 1,'张三','《邓论》' union all
    select 2,'张三','《毛概》' union all
    select 3,'张三','《马哲》' union all
    select 4,'李四','《邓论》' union all
    select 5,'李四','《政经》' union all
    select 6,'王五','《毛概》'
    GOselect min([fID]) as [fID],[fUserName],
    max(case fBookName when '《邓论》' then fBookName else '' end) as  'fBookName', 
    min([fID])as [fID],[fUserName],
    max(case fBookName when'《毛概》' then fBookName else '' end)  as  'fBookName',
    min([fID])as [fID],[fUserName],
    max(case fBookName when '《马哲》' then fBookName else '' end)  as  'fBookName'
    from [TB] group by  [fUserName]
    --> 查询结果
    SELECT * 
    FROM [TB]
    --> 删除表格
    --DROP TABLE [TB]
      

  2.   

    use test
    go
    if object_id('test.dbo.tb') is not null drop table tb
    -- 创建数据表
    create table tb
    (
    fID char(1),
    fUserName char(5),
    fBookName char(9)
    )
    go
    --插入测试数据
    insert into tb select '1','张三','《邓论》'
    union all select '2','张三','《毛概》'
    union all select '3','张三','《马哲》'
    union all select '4','李四','《邓论》'
    union all select '5','李四','《政经》'
    union all select '6','王五','《毛概》'
    go
    --代码实现declare @s varchar(max)
    select @s=isnull(@s+',','')+'fID=max(case when idd='+rtrim(idd)+' then fID else '''' end)'
    +',fUserName=max(case when idd='+rtrim(idd)+' then fUserName else '''' end)'
    +',fBookName=max(case when idd='+rtrim(idd)+' then fBookName else '''' end)'
    from(select distinct idd=row_number()over(partition by fUserName order by fID) from tb)a
    exec('select '+@s+' from (select distinct idd=row_number()over(partition by fUserName order by fID),* from tb)t  group by fUserName')/*测试结果fID fUserName fBookName fID fUserName fBookName fID fUserName fBookName
    ----------------------------------------------------------------------------
    4 李四  《邓论》  5 李四  《政经》 
    6 王五  《毛概》 
    1 张三  《邓论》  2 张三  《毛概》  3 张三  《马哲》 (3 行受影响)
    */
      

  3.   

    happycell188 你方法很不错哦!1 ?三   《??》    2 ?三   《毛概》  3 ?三   《?哲》  
    6 王五  《毛概》 
    4 李四  《??》    5 李四  《政?》   但是我在SQL 08 里面执行出来是这样的??可不可以将这个结果,放入到一个临时表里面啊?因为我还要用这个结果去 join 其他的table ??
      

  4.   

    将字段改成
    nvarchar()类型
    就不会乱码了
    go
    if object_id('tb') is not null drop table tb
    -- 创建数据表
    create table tb
    (
    fID char(1),
    fUserName Nchar(10),
    fBookName Nchar(20)
    )
    go
    --插入测试数据
    insert into tb select '1',N'张三',N'《邓论》'
    union all select '2',N'张三',N'《毛概》'
    union all select '3',N'张三',N'《马哲》'
    union all select '4',N'李四',N'《邓论》'
    union all select '5',N'李四',N'《政经》'
    union all select '6',N'王五',N'《毛概》'
    go
    --代码实现declare @s nvarchar(max)
    select @s=isnull(@s+',','')+'fID=max(case when idd='+rtrim(idd)+' then fID else '''' end)'
    +',fUserName=max(case when idd='+rtrim(idd)+' then fUserName else '''' end)'
    +',fBookName=max(case when idd='+rtrim(idd)+' then fBookName else '''' end)'
    from(select distinct idd=row_number()over(partition by fUserName order by fID) from tb)a
    exec('select '+@s+' from (select distinct idd=row_number()over(partition by fUserName order by fID),* from tb)t  group by fUserName')
      

  5.   

    或者说,可不可以在创建一个表,然后把这个结果insert 进去,我可以直接对这个表进行查询,筛选。???
      

  6.   


    --创建数据表 tt 后
    insert into tt exec('select '+@s+' from (select ....')
      

  7.   

    但是如果我只要合并同一个username 下的 三行数据,怎么办呢 ??
      

  8.   

    哦,我知道了。from(select distinct top 3 idd=row_number()over(partition by Woid order by Fpnno) from #rs_tmp)a
      

  9.   

    其实似乎可以CREATE a VIEW..