现有两个表,需要做一下变换
表tTab
锻炼类型ID   锻炼类型
-----------------------------------------
1             跑步 
2             游泳
3             打蓝球
表STab
ID     姓名     锻炼类型ID       锻炼分种
----------------------------------------- 
1      张三      1                 10                   
3      张三      2                 20                    
4      张三      3                 30
5      李四      1                 25
6      李四      3                 35我想得到的结果如下        
姓名    跑步时间      游泳时间   打蓝球时间
-------------------------------------------
张三     10            20          30
李四     25            0           35而且锻炼类型将来可能还要增加,
以后可能会有
姓名    跑步时间      游泳时间   打蓝球时间    踢足球时间 等等
---------------------------------------------------------------------
希望这个sql可以适应 表tTab 的变化来自动添加新的列请问各位大侠,这个sql怎么写啊?请帮帮忙,非常感谢

解决方案 »

  1.   

    declare @t table(锻炼类型ID int,锻炼类型 nvarchar(10))
    insert into @t select 1,'跑步' 
    union all select 2,'游泳'
    union all select 3,'打蓝球'
    declare @a table([ID] int,姓名 nvarchar(10),锻炼类型ID int,锻炼分钟 int)
    insert into @a select 1,'张三',1,10                   
    union all select 3,'张三',2,20                    
    union all select 4,'张三',3,30
    union all select 5,'李四',1,25
    union all select 6,'李四',3,35select a.锻炼类型,b.ID,姓名,b.锻炼分钟,a.锻炼类型ID into # from @t a,@a b where a.锻炼类型ID=b.锻炼类型IDdeclare @sql nvarchar(4000)
    set @sql='select 姓名'
    select @sql=@sql
              +','+quotename(锻炼类型+N'时间')
              +N'=isnull(sum(case 锻炼类型 when '+quotename(锻炼类型,N'''')
              +N' then 锻炼分钟 end),0)' 
    from #
    group by 锻炼类型,锻炼类型ID order by 锻炼类型IDexec(@sql+N' from # group by 姓名')drop table #
      

  2.   

    create table tTab
    (
      锻炼类型ID int,
      锻炼类型 varchar(100)
    )
    create table STab
    (
       ID int, 
       姓名 varchar(10),     
       锻炼类型ID int, 
       锻炼分种 int
    )insert tTab select 1,'跑步' 
    insert tTab select 2,'游泳'
    insert tTab select 3,'打蓝球'insert STab select 1,'张三',1,10
    insert STab select 3,'张三',2,20 
    insert STab select 4,'张三',3,30
    insert STab select 5,'李四',1,25
    insert STab select 6,'李四',3,35
    declare @T_SQL varchar(8000)
    set @T_SQL=''
    select @T_SQL=@T_SQL + ' sum(case when 锻炼类型ID=' + cast(锻炼类型ID as varchar) + ' then 锻炼分种 else 0 end) as ''' +  锻炼类型 + '时间'',' from tTab
    set @T_SQL='select 姓名,' + left(@T_SQL,len(@T_SQL)-1) + 'from STab group by 姓名'
    exec (@T_SQL)
      

  3.   

    create table tTab(锻炼类型ID int,  锻炼类型 varchar(10))
    insert tTab
    select 1,  '跑步' union all 
    select 2,  '游泳' union all
    select 3,  '打蓝球' 
    create table STab(ID int ,姓名 varchar(10), 锻炼类型ID int, 锻炼分钟 int)
    insert sTab
    select 1,      '张三' ,     1 ,   10    union all                
    select 3,      '张三' ,     2 ,   20    union all                 
    select 4,      '张三' ,     3 ,   30    union all 
    select 5,      '李四' ,     1 ,   25    union all 
    select 6,      '李四' ,     3 ,   35declare @sql varchar(8000)
    set @sql='select 姓名'
    select @sql=@sql+','+ttab.锻炼类型+'时间=sum(case stab.锻炼类型ID when '+cast(stab.锻炼类型ID as varchar)+' then 锻炼分钟 else 0 end)' 
    from stab,ttab
    where ttab.锻炼类型ID=stab.锻炼类型ID
    group by stab.锻炼类型ID,ttab.锻炼类型
    set @sql=@sql+' from stab group by 姓名'
    exec(@sql)
      

  4.   

    可以将上面的sum()函数 改为 max()函数
      

  5.   

    DECLARE @TTAB TABLE
    (
      锻炼类型ID INT,
      锻炼类型 VARCHAR(10)
      
    )DECLARE @STAB TABLE
    (
      ID INT,
      姓名 VARCHAR(10),
      锻炼类型ID INT,
      锻炼分种 INT
    )
    INSERT INTO @TTAB
    SELECT  1   ,          '跑步' UNION ALL 
    SELECT  2   ,          '游泳' UNION ALL
    SELECT  3   ,          '打蓝球'INSERT INTO @STAB
    SELECT  1   ,   '张三',      1 ,                10 UNION ALL                  
    SELECT  3   ,   '张三',      2 ,                20 UNION ALL                   
    SELECT  4   ,   '张三',      3 ,                30 UNION ALL
    SELECT  5   ,   '李四',      1 ,                25 UNION ALL
    SELECT  6   ,   '李四',      3 ,                35SELECT A.* ,B.锻炼类型 AS 锻炼类型
    INTO #TEMP
    FROM @STAB A,@TTAB B 
    WHERE  A.锻炼类型ID = B.锻炼类型IDSELECT 姓名,
     MAX((CASE 锻炼类型  WHEN '跑步' THEN 锻炼分种 ELSE 0  END))
     AS 跑步时间,
     MAX((CASE 锻炼类型  WHEN '游泳' THEN 锻炼分种 ELSE 0  END))
     AS 游泳时间,
     MAX((CASE 锻炼类型  WHEN '打蓝球' THEN 锻炼分种 ELSE 0  END))
     AS 打蓝球时间
    FROM  #TEMP
    GROUP BY 姓名
    DROP TABLE #TEMP
      

  6.   

    declare @ta table(锻炼类型ID int,锻炼类型 nvarchar(10))
    insert into @ta select 1,'跑步' 
    union all select 2,'游泳'
    union all select 3,'打蓝球'
    create  table  tb([ID] int,姓名 nvarchar(10),锻炼类型ID int,锻炼分钟 int)
    insert into tb select 1,'张三',1,10                   
    union all select 3,'张三',2,20                    
    union all select 4,'张三',3,30
    union all select 5,'李四',1,25
    union all select 6,'李四',3,35
    declare @s varchar(4000)
    set @s='select 姓名'
    select @s=@s+',['+锻炼类型+']=max(case when 锻炼类型ID='+cast(锻炼类型ID as varchar)
    +'then 锻炼分钟 else 0 end)'
    from @ta 
    set @s=@s+' from tb  group by 姓名'
    --print @s
    exec(@s)
    drop table tb
      

  7.   

    DECLARE @TTAB TABLE
    (
      锻炼类型ID INT,
      锻炼类型 VARCHAR(10)
      
    )DECLARE @STAB TABLE
    (
      ID INT,
      姓名 VARCHAR(10),
      锻炼类型ID INT,
      锻炼分种 INT
    )INSERT INTO @TTAB
    SELECT  1   ,          '跑步' UNION ALL 
    SELECT  2   ,          '游泳' UNION ALL
    SELECT  3   ,          '打蓝球' UNION ALL
    SELECT  4   ,          '排球'INSERT INTO @STAB
    SELECT  1   ,   '张三',      1 ,                10 UNION ALL                  
    SELECT  3   ,   '张三',      2 ,                20 UNION ALL                   
    SELECT  4   ,   '张三',      3 ,                30 UNION ALL
    SELECT  5   ,   '李四',      1 ,                25 UNION ALL
    SELECT  6   ,   '李四',      3 ,                35 UNION ALL
    SELECT  6   ,   '李四',      4 ,                35 SELECT A.* ,B.锻炼类型 AS 锻炼类型
    INTO #TEMP
    FROM @STAB A,@TTAB B 
    WHERE  A.锻炼类型ID = B.锻炼类型IDDECLARE @S VARCHAR(8000)
    SET @S = ''SELECT @S = @S+',' +'MAX(CASE  锻炼类型  WHEN ''' + 锻炼类型 +  ''' THEN  锻炼分种  ELSE 0 END)' + ' AS '+ 锻炼类型 + '时间' FROM #TEMP
    GROUP BY 锻炼类型SELECT @S = 'SELECT 姓名' + @S + ' FROM #TEMP GROUP BY 姓名' 
    EXEC(@S)DROP TABLE #TEMP