表字段:学生ID,学生交费标准(每年),已交学费(每年),交费年度,年级
         2006001    7600                7600               2006    2006
         2006001    6600                6600               2007    2006
         2006002    7600                7600               2006    2006
         2006002    6600                6600               2007    2006
         2007001    7000                7000               2007    2007
表结构大致如此求结果:
学生ID,第一年交费标准,第一年已交费用,第二年交费标准,第二年已交费用
 2006001   7600             7600             6600          6600
 2006002   7600             7600             6600          6600
 2007001   7000             7000             
想了一天了没结果 ,求高手帮助!

解决方案 »

  1.   

    --一般是不會超過4年的,就可以采用固定的寫法
    Select
    学生ID,
    Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
    Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
    Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
    Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
    Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用
    From
    TEST
    Group By
    学生ID
      

  2.   

    declare @sql varchar(8000)
    SELECT @sql = 'select 学生ID '
    select @sql = @sql + ',sum(case cou when '''+cou+''' then 学生交费标准(每年) else 0 end) as  '''+cou  
    +',sum(case cou when '''+cou+''' then 已交学费(每年) else 0 end) as  '''+cou +''','
    from (select distinct cou  from (select *,(select count(1) from 表 where 学生ID=a.学生ID and a.交费年度> 交费年度) as cou from 表 a)a) as a
    select @sql = @sql + ' from (select *,(select count(1) from 表 where 学生ID=a.学生ID and a.交费年度> 交费年度) as cou from 表 a)a group by cou'
    exec(@sql)差不多这样~
      

  3.   

    --創建測試環境
    Create Table TEST
    (学生ID Char(7),
     学生交费标准 Int,
     已交学费 Int,
     交费年度 Int,
     年级 Int)
    Insert TEST Select          '2006001',    7600,                7600,               2006,    2006
    Union All Select          '2006001',    6600,                6600,               2007,    2006
    Union All Select          '2006002',    7600,                7600,               2006,    2006
    Union All Select          '2006002',    6600,                6600,               2007,    2006
    Union All Select          '2007001',    7000,                7000,               2007,    2007
    GO
    --測試
    --一般是不會超過4年的,就可以采用固定的寫法
    Select
    学生ID,
    Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
    Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
    Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
    Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
    Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用
    From
    TEST
    Group By
    学生ID
    GO
    --刪除測試環境
    Drop Table TEST
    --結果
    /*
    学生ID 第一年交费标准 第一年交费标准 第二年交费标准 第二年已交费用 第三年交费标准 第三年已交费用 第四年交费标准 第四年已交费用
    2006001 7600 7600 6600 6600 NULL NULL NULL NULL
    2006002 7600 7600 6600 6600 NULL NULL NULL NULL
    2007001 7000 7000 NULL NULL NULL NULL NULL NULL
    */
      

  4.   

    --如果一定是使用动态语句--创建测试环境
    Create Table TEST
    (学生ID Char(7),
     学生交费标准 Int,
     已交学费 Int,
     交费年度 Int,
     年级 Int)
    Insert TEST Select          '2006001',    7600,                7600,               2006,    2006
    Union All Select          '2006001',    6600,                6600,               2007,    2006
    Union All Select          '2006002',    7600,                7600,               2006,    2006
    Union All Select          '2006002',    6600,                6600,               2007,    2006
    Union All Select          '2007001',    7000,                7000,               2007,    2007
    GO
    --测试
    Declare @S Varchar(8000)
    Select @S = 'Select 学生ID' 
    Select @S = @S + ', Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 学生交费标准 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年交费标准,
    Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 已交学费 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年已交费用'
    From (Select Distinct 交费年度 - 年级 As 年度 From TEST) A Order By 年度
    Select @S = @S + ' From TEST Group By 学生ID'
    EXEC(@S)
    GO
    --删除测试环境
    Drop Table TEST
    --结果
    /*
    学生ID 第1年交费标准 第1年已交费用 第2年交费标准 第2年已交费用
    2006001 7600 7600 6600 6600
    2006002 7600 7600 6600 6600
    2007001 7000 7000 NULL NULL
    */
      

  5.   

    --测试
    if exists(select * form sysobjects where name='t_stu')
    BEGIN
    DROP TABLE t_stu
    END
    create table t_stu(学生ID int null,学生交费标准每年 int null,已交学费每年 int null,交费年度 int null,年级 int null)
    insert into t_stu(学生ID,学生交费标准每年,已交学费每年,交费年度,年级)
    select 
             2006001,    7600,                7600,               2006,    2006 union all select 
             2006001,    6600,                6600,               2007,    2006 union all select
             2006002,    7600,                7600,               2006,    2006 union all select
             2006002,    6600,                6600,               2007,    2006 union all select
             2007001,    7000,                7000,               2007,    2007declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+'max(case when 交费年度=cast('+cast(t.交费年度 as varchar(20))+' as int) then 学生交费标准每年 else 0 end  ) 
    as 第'+cast(t.交费年度 as varchar(20)) +'年度交费标准 ,max(case when 交费年度=cast('+cast(t.交费年度 as varchar(20))+' as int) then 已交学费每年 else 0 end  ) as 第'+cast(t.交费年度 as varchar(20)) +'已交学费 ,'
     from (select distinct 交费年度 from t_stu ) as t
    print @sql
    select @sql=substring(@SQL,1,LEN(@SQL)-1)SELECT @SQL='SELECT 学生ID,'+@SQL+' FROM  T_STU  GROUP BY 学生ID'
    PRINT @SQLEXEC(@SQL)drop table t_stu
      

  6.   

    qsqtok() ( ) 信誉:100    Blog   加为好友  2007-07-16 10:15:47  得分: 0  
     
     
       谢谢各位!  如果要统计一下总的欠费金额  怎么写?
      
     
    -------------
    修改一點即可
    --固定的寫法
    Select
    学生ID,
    Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
    Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
    Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
    Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
    Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
    Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用,
    SUM(学生交费标准 - 已交学费) As 总欠费金额
    From
    TEST
    Group By
    学生ID--動態的寫法Declare @S Varchar(8000)
    Select @S = 'Select 学生ID' 
    Select @S = @S + ', Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 学生交费标准 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年交费标准,
    Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 已交学费 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年已交费用'
    From (Select Distinct 交费年度 - 年级 As 年度 From TEST) A Order By 年度
    Select @S = @S + ', SUM(学生交费标准 - 已交学费) As 总欠费金额 From TEST Group By 学生ID'
    EXEC(@S)
      

  7.   

    yun了  怎么结不了帖了   点给分按钮没反映