码迷,mamicode.com
首页 > 数据库 > 详细

sql pivot、unpivot和partition by用法

时间:2015-03-30 17:57:00      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

演示脚本

技术分享
IF not exists(SELECT 1 from sys.sysobjects where name = Student AND type = U)
BEGIN
    CREATE table Student(
        ID            int            identity    primary key,
        ClassID        int                        default 0    ,    --班级ID
        CourseName    nvarchar(20)                        ,    --课程
        Name        nvarchar(20)                        ,    --姓名
        Score        tinyint                    default 0        --成绩
    )
END
GO

IF not exists(SELECT 1 from Student)
begin
    INSERT INTO Student(ClassID,CourseName,Name,Score)
    SELECT 1,数学,小红,80
    UNION ALL
    SELECT 1,语文,小红,90
    UNION ALL
    SELECT 1,英语,小红,88
    UNION ALL
    SELECT 1,数学,小明,91
    UNION ALL
    SELECT 1,语文,小明,78
    UNION ALL
    SELECT 1,英语,小明,82
    UNION ALL
    SELECT 2,数学,小强,67
    UNION ALL
    SELECT 2,语文,小强,76
    UNION ALL
    SELECT 2,英语,小强,58
    UNION ALL
    SELECT 2,数学,小丽,87
    UNION ALL
    SELECT 2,语文,小丽,94
    UNION ALL
    SELECT 2,英语,小丽,98
    end
GO
View Code

一 行列互转pivot和unpivot

  msdn参考

方法1:

SELECT Name,
sum(CASE CourseName WHEN 数学 THEN Score ELSE 0 END) as 数学,
sum(CASE CourseName WHEN 语文 THEN Score ELSE 0 END) as 语文,
sum(CASE CourseName WHEN 英语 THEN Score ELSE 0 END) as 英语
from Student
group BY Name

方法2:

SELECT t.Name,
sum(t.数学) as 数学,
sum(t.语文) as 语文,
sum(t.英语) as 英语 
from (
    SELECT Name,数学,语文,英语
    from Student
    PIVOT(
        SUM(Score) FOR CourseName IN(数学,语文,英语)
    ) tb
) t
GROUP BY t.Name

查询结果:

Name                 数学          语文          英语
-------------------- ----------- ----------- -----------
小红                   80          90          88
小丽                   87          94          98
小明                   91          78          82
小强                   67          76          58

 二 partition by

如按每门课分数从高到低排

SELECT CourseName,Name,Score, 
row_number() over(partition by CourseName order by Score desc) as Num
from Student

查询结果:

CourseName           Name                 Score Num
-------------------- -------------------- ----- --------------------
数学                   小明                   91    1
数学                   小丽                   87    2
数学                   小红                   80    3
数学                   小强                   67    4
英语                   小丽                   98    1
英语                   小红                   88    2
英语                   小明                   82    3
英语                   小强                   58    4
语文                   小丽                   94    1
语文                   小红                   90    2
语文                   小明                   78    3
语文                   小强                   76    4

 

sql pivot、unpivot和partition by用法

标签:

原文地址:http://www.cnblogs.com/xqhppt/p/4378075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!