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 Java 数据库连接
SQL SELECT语句的基本用法
SQL SELECT语句的基本用法
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
6月前
|
SQL 程序员
sql中的distinct用法
`DISTINCT`在SQL中用于返回唯一不同的值,消除结果集中的重复行。基本用法包括:1) 选择单列唯一值,如`SELECT DISTINCT department FROM employees;`
|
2月前
|
SQL 存储 安全
SQL Server用法
SQL Server用法
63 1
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1
|
3月前
|
SQL 关系型数据库 MySQL
8、SQL高级用法
8、SQL高级用法
18 0
|
5月前
|
SQL 数据库
SQL中CASE WHEN THEN ELSE END的用法详解
SQL中CASE WHEN THEN ELSE END的用法详解
|
5月前
|
SQL
SQL语句case when then else end用法
SQL语句case when then else end用法
|
5月前
|
SQL 数据库
SQL DISTINCT 用法总结
SQL DISTINCT 用法总结
|
5月前
|
SQL XML Java
MyBatis动态SQL------------------choose用法
MyBatis动态SQL------------------choose用法
58 1