我有一张这样的表
employ_id  year_text  month_text   days     money 
     1       2010        1          5#       10
     1       2010        1          6#       10
     1       2010        1          7#       10
     1       2010        1          8#       10
     1       2010        1          9#       10
     1       2010        1          10#      10
     2       2010        1          5#       10
     2       2010        1          6#       10
     3       2010        1          7#       10
     4       2010        1          8#       10
     5       2010        1          9#       10
     2       2010        1          10#      10如何得到这样的数据
employ_id    5#     6#      7#       8#     9#       10#     1       10    10       10       10     10       10
     2       10    10        0        0      0       10
     3        0     0       10        0      0        0
     4        0     0        0       10      0        0
     5        0     0        0        0     10        0
好像直接使用行列转换的方式不行呢

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :SQL77(只为思齐老)
    -- Date    :2010-01-16 17:05:05
    -- Version:
    --      Microsoft SQL Server  2000 - 8.00.194 (Intel X86) 
    -- Aug  6 2000 00:57:48 
    -- Copyright (c) 1988-2000 Microsoft Corporation
    -- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:#A
    if object_id('tempdb.dbo.#A') is not null drop table #A
    go 
    create table #A([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
    insert #A
    select 1,2010,1,'5#',10 union all
    select 1,2010,1,'6#',10 union all
    select 1,2010,1,'7#',10 union all
    select 1,2010,1,'8#',10 union all
    select 1,2010,1,'9#',10 union all
    select 1,2010,1,'10#',10 union all
    select 2,2010,1,'5#',10 union all
    select 2,2010,1,'6#',10 union all
    select 3,2010,1,'7#',10 union all
    select 4,2010,1,'8#',10 union all
    select 5,2010,1,'9#',10 union all
    select 2,2010,1,'10#',10
    --------------开始查询--------------------------
    DECLARE @SQL VARCHAR(8000)
    SET @SQL='SELECT employ_id'
    SELECT @SQL=@SQL+',SUM(CASE WHEN days='''+[days]+''' THEN money ELSE 0 END)AS '''+days+''''
    FROM (SELECT DISTINCT days FROM #A)AS T
    EXEC( @SQL+' FROM #A GROUP BY employ_id')--select * from #A
    ----------------结果----------------------------
    /* (所影响的行数为 12 行)employ_id   10#         5#          6#          7#          8#          9#          
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          10          10          10          10          10
    2           10          10          10          0           0           0
    3           0           0           0           10          0           0
    4           0           0           0           0           10          0
    5           0           0           0           0           0           10
    */
      

  2.   

    *
    标题:普通行列转换(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')---------------------------------
      

  3.   

    ----------------------------------------------------------------
    -- Author  :SQL77(只为思齐老)
    -- Date    :2010-01-16 17:05:05
    -- Version:
    --      Microsoft SQL Server  2000 - 8.00.194 (Intel X86) 
    -- Aug  6 2000 00:57:48 
    -- Copyright (c) 1988-2000 Microsoft Corporation
    -- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:#A
    if object_id('tempdb.dbo.#A') is not null drop table #A
    go 
    create table #A([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
    insert #A
    select 1,2010,1,'5#',10 union all
    select 1,2010,1,'6#',10 union all
    select 1,2010,1,'7#',10 union all
    select 1,2010,1,'8#',10 union all
    select 1,2010,1,'9#',10 union all
    select 1,2010,1,'10#',10 union all
    select 2,2010,1,'5#',10 union all
    select 2,2010,1,'6#',10 union all
    select 3,2010,1,'7#',10 union all
    select 4,2010,1,'8#',10 union all
    select 5,2010,1,'9#',10 union all
    select 2,2010,1,'10#',10
    --------------开始查询--------------------------
    DECLARE @SQL VARCHAR(8000)SET @SQL='SELECT employ_id'SELECT @SQL=@SQL+',SUM(CASE WHEN days='''+LTRIM([days])+'#'' THEN money ELSE 0 END)AS '''+LTRIM(days)+'#'''FROM 
    (SELECT DISTINCT TOP 100 PERCENT  CONVERT(INT,REPLACE(days,'#',''))AS DAYS FROM #A 
    ORDER BY CONVERT(INT,REPLACE(days,'#',''))  )AS T
    EXEC( @SQL+' FROM #A GROUP BY employ_id')--select * from #A
    ----------------结果----------------------------
    /* (所影响的行数为 12 行)employ_id   5#          6#          7#          8#          9#          10#         
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    1           10          10          10          10          10          10
    2           10          10          0           0           0           10
    3           0           0           10          0           0           0
    4           0           0           0           10          0           0
    5           0           0           0           0           10          0*/
      

  4.   


    declare @sql varchar(8000)
    set @sql='select employ_id'
    select @sql=@sql+',['+days+']=sum(case days when '''+days+''' then money else 0 end)'
    from (select distinct days from 表名)a
    set @sql=@sql+' from 表名 group by employ_id'
    exec(@sql)
      

  5.   

    --> 测试数据: [tb]
    if object_id('[tb]') is not null drop table [tb]
    create table [tb] (employ_id int,year_text int,month_text int,days varchar(3),money int)
    insert into [tb]
    select 1,2010,1,'5#',10 union all
    select 1,2010,1,'6#',10 union all
    select 1,2010,1,'7#',10 union all
    select 1,2010,1,'8#',10 union all
    select 1,2010,1,'9#',10 union all
    select 1,2010,1,'10#',10 union all
    select 2,2010,1,'5#',10 union all
    select 2,2010,1,'6#',10 union all
    select 3,2010,1,'7#',10 union all
    select 4,2010,1,'8#',10 union all
    select 5,2010,1,'9#',10 union all
    select 2,2010,1,'10#',10declare @sql varchar(8000)
    set @sql='select employ_id'
    select @sql=@sql+',['+days+']=sum(case days when '''+days+''' then money else 0 end)'
    from (select distinct days from tb)a
    set @sql=@sql+' from tb group by employ_id'
    exec(@sql)/*结果
    employ_id   10#         5#          6#          7#          8#          9#
    ----------- ----------- ----------- ----------- ----------- ----------- -----------
    1           10          10          10          10          10          10
    2           10          10          10          0           0           0
    3           0           0           0           10          0           0
    4           0           0           0           0           10          0
    5           0           0           0           0           0           10*/
      

  6.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-01-16 17:11:17
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([employ_id] int,[year_text] int,[month_text] int,[days] varchar(3),[money] int)
    insert [tb]
    select 1,2010,1,'5#',10 union all
    select 1,2010,1,'6#',10 union all
    select 1,2010,1,'7#',10 union all
    select 1,2010,1,'8#',10 union all
    select 1,2010,1,'9#',10 union all
    select 1,2010,1,'10#',10 union all
    select 2,2010,1,'5#',10 union all
    select 2,2010,1,'6#',10 union all
    select 3,2010,1,'7#',10 union all
    select 4,2010,1,'8#',10 union all
    select 5,2010,1,'9#',10 union all
    select 2,2010,1,'10#',10
    --------------开始查询-----------------------------动态 
    declare @sql varchar(8000)
    set @sql = 'select employ_id '
    select @sql = @sql + ' , sum(case days when ''' + days + ''' then money else 0 end) [' + days + ']'
    from (select distinct days from tb) as a
    set @sql = @sql + ' from tb group by employ_id'
    exec(@sql) --静态
    select 
     employ_id  , 
     sum(case days when '10#' then money else 0 end) [10#] , 
     sum(case days when '5#' then money else 0 end) [5#] , 
     sum(case days when '6#' then money else 0 end) [6#] , 
     sum(case days when '7#' then money else 0 end) [7#] , 
     sum(case days when '8#' then money else 0 end) [8#] , 
     sum(case days when '9#' then money else 0 end) [9#] 
    from 
     tb 
    group by
     employ_id----------------结果----------------------------
    /* employ_id   10#         5#          6#          7#          8#          9#
    ----------- ----------- ----------- ----------- ----------- ----------- -----------
    1           10          10          10          10          10          10
    2           10          10          10          0           0           0
    3           0           0           0           10          0           0
    4           0           0           0           0           10          0
    5           0           0           0           0           0           10(5 行受影响)
    */