sql pivot、unpivot和partition by用法

简介: 原文:sql pivot、unpivot和partition by用法演示脚本 IF not exists(SELECT 1 from sys.sysobjects where name = 'Student' AND type = 'U') BEGIN CREATE tabl...
原文: sql pivot、unpivot和partition by用法

演示脚本

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

 

目录
相关文章
|
4月前
|
SQL
SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
SQL的AND运算符用于根据多个条件筛选记录,确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法:
51 1
|
6月前
|
SQL 存储 关系型数据库
软件测试|SQL JOIN的用法,你会了吗?
软件测试|SQL JOIN的用法,你会了吗?
45 0
|
1月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
18 0
|
1月前
|
SQL Java 关系型数据库
MyBatis中的9种常用动态sql标签精妙用法
MyBatis中的9种常用动态sql标签精妙用法
58 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql SQL的一些特殊用法记录
1、查询group by having 中having不起作用,及解决
15 0
|
7月前
|
SQL
SQL语句多个表查询,inner join的用法
SQL语句多个表查询,inner join的用法
90 0
|
2月前
|
SQL
SQL语句case when的用法
SQL语句case when的用法
|
3月前
|
SQL JSON 分布式计算
Spark SQL简介与基本用法
Spark SQL简介与基本用法
|
3月前
|
SQL 流计算
Flink SQL提供了行转列的功能,可以通过使用`UNPIVOT`操作来实现
【1月更文挑战第1天】Flink SQL提供了行转列的功能,可以通过使用`UNPIVOT`操作来实现
115 0
|
4月前
|
SQL 存储 数据库
SQL 算术运算符:加法、减法、乘法、除法和取模的用法
存储过程是一段预先编写好的 SQL 代码,可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元,并为其分配一个名称,以便在需要时调用执行。存储过程可以接受参数,使其更加灵活和通用。
59 0