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 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

一 行列互转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
时间: 2024-08-01 05:26:37

sql pivot、unpivot和partition by用法的相关文章

SQL Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

【SQL】ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例

原文:[SQL]ROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例 #用法说明 select row_number() over(partition by A order by B ) as rowIndex from table A :为分组字段 B:为分组后的排序字段. table 表的结构 多为:  多人 多条的相关数据.(比如:订单信息) 此条sql语句,多用于对数据进行分组排序,并对每个组中的数据分别进行编号,编号从1开始

如何在SQL中产生交叉式数据表(枢纽分析表)Part 2(PIVOT,UNPIVOT)

之前小喵使用SQL2000的时候,为了产生交叉数据表(Excel中称为枢纽分析表),小喵用了以下这篇的方式来处理 http://www.dotblogs.com.tw/topcat/archive/2008/04/14/2909.aspx 这样的方式在SQL 2005里面一样可以用,不过2005又新增了一个更方便的东西,可以更简洁的来处理.这个东西就是[PIVOT],神奇的是,除了可以透过PIVOT产生交叉数据表,还可以透过UNPIVOT将交叉数据表转回原来的方式(这对于有些数据表的正规化很有帮

Oracle pivot & unpivot

pivot & unpivot 11g新特性 1     pivot 以列-值对的形式出现,典型的行转列报表函数. create table test_demo(id int,name varchar(20),nums int);  ---- 创建表 insert into test_demo values(1, '苹果', 1000); insert into test_demo values(2, '苹果', 2000); insert into test_demo values(3, '苹

Sql decode sign when length concat 用法详述

案例1:查询表A数据,如果某个列(PARAM_VALUE)值太长,前台不好显示,就只取前20个字符:鼠标悬浮时再用层显示全部值: sql写法: select m.PARAM_VALUE as PARAM_VALUE, decode(sign(length(m.PARAM_VALUE)-20),1,CONCAT(SUBSTR(m.PARAM_VALUE,0,20),'...'),m.PARAM_VALUE) as PARAM_VALUE_MSG from tableA m decode()函数简介

SQL中的LIKE语句的用法

SQL中的LIKE语句的用法 内容 在SQL结构化查询语言中,LIKE语句有着至关重要的作用.LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的. 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据.现在我们要在姓名字段中查询以“张”字开头的记录,语句如下:     select * from table1 wh

SQL PIVOT

SELECT 最终要展现的列,旧表的列也行,PIVOT表的别名.列名(在下方IN里面) as 别名也行 FROM 表 PIVOT( SUM(要统计的值,在新表中每行出现一次,出现在归属于in里[]的某列下面,其余为null) FOR [旧表的列,新表中以此列下面行的值为列名,列名在IN里面以[]列出] IN (旧表列(前面FOR中)的值,以[],[]形式列出) )as 别名要记得加 SQL PIVOT,布布扣,bubuko.com

SQL Server中except和intersect用法

except是A集合减去B集合的结果:intersect是A集合和B集合的交集:都是返回的是非重复值,很多属性都和union类似. 还是以student为例 select * from student; select * into student1 from student; go insert into student1 values('aaa',20,'Js'),('bbb',30,'js'),('ccc',40,'sh'); go insert into student1 values('

sql中exists,not exists的用法

转 sql中exists,not exists的用法 exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:  select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成"select 2 from grade where ...",那么返回