年级 班级   平均分   最高分   及格率
 初1   A       80.6     94        87
 初2   B       89.6     99        95.9
.....
转换成年级  A   A平均分  A最高分 A及格率  B班级 B平均分 B最高分 B及格率   小弟想了一晚上也没想想出,在此请教.请指点

解决方案 »

  1.   

    select * from 
    (select 年级 班级   平均分   最高分   及格率 from 表 where 年纪='初1') a,
    (select 年级 班级   平均分   最高分   及格率 from 表 where 年纪='初2') b
      

  2.   

    create table test(年级 varchar(10),班级 varchar(10),平均 decimal(5,1),最高分 int,及格率 decimal(5,1))
    insert test select '初1','A',80.6,94,87
    union all select '初2','B',89.6,99,95.9declare @s varchar(8000)
    set @s='SELECT 年级,班级'
    select @s=@s+ ',MAX(case 班级 when '''+班级+''' then 平均分 end) as ['+班级+'平均分]
    ,MAX(case 班级 when '''+班级+''' then 最高分 end) as ['+班级+'最高分]
    ,MAX(case 班级 when '''+班级+''' then 及格率 end) as ['+班级+'及格率]'
     from test
    SET @s=@s+ ' FROM test GROUP BY 年级,班级'
    exec(@s)年级         班级         A平均分    A最高分        A及格率    B平均分    B最高分        B及格率    
    ---------- ---------- ------- ----------- ------- ------- ----------- ------- 
    初1         A          80.6    94          87.0    NULL    NULL        NULL
    初2         B          NULL    NULL        NULL    89.6    99          95.9警告: 聚合或其它 SET 操作消除了空值。
      

  3.   

    改下:
    declare @s varchar(8000)
    set @s='SELECT 年级'
    select @s=@s+ ',MAX(case 班级 when '''+班级+''' then 班级 end) as ['+班级+'班级]
    ,MAX(case 班级 when '''+班级+''' then 平均分 end) as ['+班级+'平均分]
    ,MAX(case 班级 when '''+班级+''' then 最高分 end) as ['+班级+'最高分]
    ,MAX(case 班级 when '''+班级+''' then 及格率 end) as ['+班级+'及格率]'
     from test
    SET @s=@s+ ' FROM test GROUP BY 年级'
    exec(@s)年级         A班级        A平均分    A最高分        A及格率    B班级        B平均分    B最高分        B及格率    
    ---------- ---------- ------- ----------- ------- ---------- ------- ----------- ------- 
    初1         A          80.6    94          87.0    NULL       NULL    NULL        NULL
    初2         NULL       NULL    NULL        NULL    B          89.6    99          95.9
      

  4.   

    行转列在MS SQL里面又叫 交叉数据表。你可以直接查一下SQL的帮助。里面有详细的说明的。
      

  5.   

    DECLARE @SDATE VARCHAR(10)
    DECLARE @EDATE VARCHAR(10)
    SELECT @SDATE=CONVERT(VARCHAR(10),@startdate,121)
    SELECT @EDATE=CONVERT(VARCHAR(10),@enddate,121)
    SELECT @SDATE=SUBSTRING(@SDATE,3,2)+SUBSTRING(@SDATE,6,2)+SUBSTRING(@SDATE,9,2)
    SELECT @EDATE=SUBSTRING(@EDATE,3,2)+SUBSTRING(@EDATE,6,2)+SUBSTRING(@EDATE,9,2)SET @SQL=''
    SELECT @SQL=@SQL+',SUM(CASE MACNA WHEN '''+MACNA+''' THEN COUN ELSE 0 END) AS '+MACNA
    FROM (SELECT MACNA FROM SMNIN WHERE LEFT(MACID,2)='14')TSET @SQL='
    SELECT ISNULL(MATNA,''合计'') AS MATNA'+@SQL+',SUM(COUN) AS 合计 
    FROM (SELECT  T3.MACNA,
    ISNULL(T2.MaterialCode,'' '') AS MATNA,
    COUNT(*) AS COUN
    FROM SSINF T1
    LEFT JOIN tb_TE_Material T2
    ON T1.TYRSP=T2.MaterialID
    LEFT JOIN SMNIN T3
    ON T1.MACID=T3.MACID
    WHERE T1.ShiftNo>='''+@SDATE+'00000000000'' AND T1.ShiftNo<='''+@EDATE+'99999999999''
    GROUP BY MACNA,MaterialCode) T
    GROUP BY MATNA
    WITH CUBE'
    EXEC(@SQL)
      

  6.   

    SELECT @SQL=@SQL+',SUM(CASE MACNA WHEN '''+MACNA+''' THEN COUN ELSE 0 END) AS '+MACNA
    FROM (SELECT MACNA FROM SMNIN WHERE LEFT(MACID,2)='14')T
    这句就是你要的东西!