zoukankan      html  css  js  c++  java
  • SqlServer 行转列,列转行 以及PIVOT函数快速实现行转列,UNPIVOT实现列转行

     一   、列转行

    创建所需的数据

    CREATE TABLE [StudentScores](

    [UserName] NVARCHAR(20), --学生姓名
    [Subject] NVARCHAR(30), --科目
    [Score] FLOAT, --成绩
    )

    INSERT INTO [StudentScores] SELECT '张三', '语文', 50
    INSERT INTO [StudentScores] SELECT '张三', '数学', 90
    INSERT INTO [StudentScores] SELECT '张三', '英语', 70
    INSERT INTO [StudentScores] SELECT '张三', '生物', 95
    INSERT INTO [StudentScores] SELECT '李四', '语文', 80
    INSERT INTO [StudentScores] SELECT '李四', '数学', 92
    INSERT INTO [StudentScores] SELECT '李四', '英语', 86
    INSERT INTO [StudentScores] SELECT '李四', '生物', 88

    查询 结果

    UserName Subject Score

    Nick 语文 80
    Nick 数学 90
    Nick 英语 70
    Nick 生物 85
    Kent 语文 80
    Kent 数学 90
    Kent 英语 70
    Kent 生物 85

    1.使用case when  then   else  end方法

    select UserName ,

    max( case [Subject] when '语文' then score else 0 end) as '语文',

    max( case [Subject] when '数学' then score else 0 end) as '数学',

    max( case [Subject] when '英语' then score else 0 end) as '英语',

    max( case [Subject] when '生物' then score else 0 end) as '生物' from StudentScores group by UserName

    实现结果

    UserName 语文 数学 英语 生物
    Kent 80 90 70 85
    Nick 80 90 70 85

    2.使用pivot 函数解决

    首先看pivot的函数的语法

    PIVOT函数的格式如下

    PIVOT(<聚合函数>([聚合列值]) FOR [行转列前的列名] IN([行转列后的列名1],[行转列后的列名2],[行转列后的列名3],.......[行转列后的列名N]))
    • <聚合函数>就是我们使用的SUM,COUNT,AVG等Sql聚合函数,也就是行转列后计算列的聚合方式。
    • [聚合列值]要进行聚合的列名
    • [行转列前的列名]这个就是需要将行转换为列的列名。
    • [行转列后的列名]这里需要声明将行的值转换为列后的列名,因为转换后的列名其实就是转换前行的值,所以上面格式中的[行转列后的列名1],[行转列后的列名2],[行转列后的列名3],......[行转列后的列名N]其实就是[行转列前的列名]每一行的值。

    sql 语句如下:select * from StudentScores as A

    pivot (max(score) for Subject in ([英语],[数学],[语文],[生物])) as M

      二 、行转列   

    准备数据

    CREATE TABLE ProgrectDetail
    (
    ProgrectName NVARCHAR(20), --工程名称
    OverseaSupply INT, --海外供应商供给数量
    NativeSupply INT, --国内供应商供给数量
    SouthSupply INT, --南方供应商供给数量
    NorthSupply INT --北方供应商供给数量
    )

    INSERT INTO ProgrectDetail
    SELECT 'A', 100, 200, 50, 50
    UNION ALL
    SELECT 'B', 200, 300, 150, 150
    UNION ALL
    SELECT 'C', 159, 400, 20, 320
    UNION ALL
    SELECT 'D', 159, 400, 20, 320

    1.使用 UNION ALL  方法

    select ProgrectName,OverseaSupply(需要转列的名称) from ProgrectDetail
    union all
    select ProgrectName,NativeSupply from ProgrectDetail
    union all
    select ProgrectName,SouthSupply from ProgrectDetail
    union all
    select ProgrectName,NorthSupply from ProgrectDetail

    2.使用 unpivot函数

    UNPIVOT函数的格式如下:

    UNPIVOT([转换为行的列值在转换后对应的列名] for [转换为行的列名在转换后对应的列名] in ([转换为行的列1],[转换为行的列2],[转换为行的列3],...[转换为行的列N]))
    • [转换为行的列值在转换后对应的列名]这个是进行列转行的列其数据值在转换为行后的列名称
    • [转换为行的列名在转换后对应的列名]这个是进行列转行的列其列名在转换为行后的列名称
    • [转换为行的列]这个是声明哪些列要进行列转行

    select p.ProgrectName,plvalue, typepl from (
    select ProgrectName,OverseaSupply,NativeSupply,SouthSupply,NorthSupply from ProgrectDetail) t

    unpivot ( plvalue for typepl in (OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) ) p

    坚持    写博客,把学过的东西记录下来

  • 相关阅读:
    git
    composer
    laravel saas
    算法模板-01背包
    GMP-C/C++(大数库)使用方法
    算法模板-容斥原理
    算法模板-欧拉函数
    算法模板-素数判断/素数筛法
    算法模板-质因数分解
    算法模板-快速幂取模
  • 原文地址:https://www.cnblogs.com/dashanboke/p/9300223.html
Copyright © 2011-2022 走看看