表格是这样子的
name   subject   grade
张三     语文     90
张三     数学     80
张三     英语     70
李四     语文     60
李四     数学     90
李四     英语     80用查询语句 使查出来的东西 显示成 
姓名    语文  数学  英语
张三    90    80    70  
李四    60    90    80典型的行转列问题  我用的SQL代码是select name as 姓名 ,max(case subject when '语文' then grade else 0 end) 语文,max(case subject when '数学' then grade else 0 end) 数学,max(case subject when '英语' then grade else 0 end) 英语  from grades group by name虽然实现了功能  但是上头又给我新的难题,说我这种查询语句 对大型数据内容 比如上百万的数据就查的很慢了
然后叫我用分页查询来辅助完成上面的查询,从而优化查询。我的上网查了一下 研究了一下 弄出个代码select top 6 * 
from grades
where name not in
(select top 0 name from grades order by name)
order by name
之后我就完全不知道要怎么结合这些东西 完成查询的优化了,求高手指点,我是新手!今天刚注册。

解决方案 »

  1.   


    USE Test
    GO
    --姓名 语文 数学 英语
    --张三 90 80 70  
    --李四 60 90 80--if object_id('t1') is not null 
    -- drop table t1
    --Go
    Create table t1([name] nvarchar(2),[subject] nvarchar(2),[grade] smallint)
    Insert into t1
    Select N'张三',N'语文',90
    Union all Select N'张三',N'数学',80
    Union all Select N'张三',N'英语',70
    Union all Select N'李四',N'语文',60
    Union all Select N'李四',N'数学',90
    Union all Select N'李四',N'英语',80
    SELECT name,语文,数学,英语 FROM t1
    PIVOT (
    MAX(grade) FOR subject IN (语文,数学,英语)
    )p
      

  2.   

    这不是新建一个表,我只是做个例子给你看.
    主体是这句:SELECT name,语文,数学,英语 FROM t1
    PIVOT (
        MAX(grade) FOR subject IN (语文,数学,英语)
    )p
      

  3.   

    我把你上面的t1表 换成 我的表grades之后,为什么 查出来的东西变成这个样子了老李 88   NULL  NULL
    老李 NULL NULL  75
    老李 NULL 100   NULL
    李四 87   NULL  NULL
    李四 NULL 40    NULL
    李四 NULL NULL  70
    ……
    怎么才能 让他们合在一起呢
      

  4.   

    SELECT name as 姓名,语文,数学,英语 FROM grades
    PIVOT (
        MAX(grade) FOR subject IN (语文,数学,英语)
    )p
      

  5.   

    我不会发图  表有4个字段  ID(int 自增字段 not null) name(nvarchar(10)) subject(nvarchar(10))  grade(int)
    内容的话  就和上面的差不多了
      

  6.   

    我没有select ID呀 语句 就这么一句
    SELECT name as 姓名,语文,数学,英语 FROM grades
    PIVOT (
        MAX(grade) FOR subject IN (语文,数学,英语)
    )p
      

  7.   

    虽然暂时没搞定 但是 已经懂的了个方向 就差最后的NULL 弄没掉 排成一排了  估计你忙 没时间继续讨论我先给分吧
      

  8.   

    ;WITH c AS (
    SELECT [name],[subject],[grade] FROM t1
    )
    SELECT name as 姓名,语文,数学,英语 FROM c
    PIVOT (
      MAX(grade) FOR subject IN (语文,数学,英语)
    )p
      

  9.   

    啧啧 你太厉害了 尽然成功了 但是现在我又遇见另外一个问题
    就是能用SQL server的分页技术 或子查询技术 将我刚才查出来的那些东西 随意分页么