zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [extjs] ExtJs4.2 Form 表单提交
    [java ] java.util.zip.ZipException: error in opening zip file
    Oracle 11g 执行计划管理1
    Oracle 分区表的统计信息实例
    Oracle 手动收集统计信息
    Oracle 10g 之自动收集统计信息
    Oracle 11g 之自动收集统计信息
    Oracle 11gR2 RAC修改SCAN IP
    共享内存shared pool (6):追踪sql语句
    共享内存shared pool (5):详解一条SQL在library cache中解析
  • 原文地址:https://www.cnblogs.com/xqhppt/p/4378075.html
Copyright © 2011-2022 走看看