关于SQLServer 中行列互转的实例说明

关于SQLServer 中行列互转的实例说明

这几天在做一个招标系统中审批模块,其中关于报价信息这块,用到了pivot和unpivot来实现数据的行列互转,下面简单介绍一下,实际案例,便于回忆和记录相关的条件下使用的情况。pivot 与 unpivot 函数是SQL2005新提供的2个函数,PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

      下面我通过PIVOT 来阐述整个函数的使用:

      语法

SELECT <非透视的列>,

    [第一个透视的列] AS <列名称>,

     [第二个透视的列] AS <列名称>, …

[最后一个透视的列] AS <列名称>,

FROM(<生成数据的 SELECT 查询>)

 AS <源查询的别名>

PIVOT(

<聚合函数>(<要聚合的列>)

FOR

[<包含要成为列标题的值的列>]

IN ( [第一个透视的列], [第二个透视的列], … [最后一个透视的列])

) AS <透视表的别名>

实例
select PRICE,Sup_Name,QUOT_ITEM1,QUOT_ITEM3,QUANTITY from
 Q2B_QUOT_ITEM where <相关条件筛选>

执行显示

       PRICE Sup_Name QUOT_ITEM1   QUOT_ITEM3 QUANTITY
         342 测试供应商1 5H52921000088 剪刀              4.000
         422 测试供应商1 5H48911000023 黑色水笔芯     2.000
         211 测试供应商1 5H57161000002 计算器           2.000
         324 测试供应商2 5H52921000088 剪刀              4.000
         342 测试供应商2 5H48911000023 黑色水笔芯      2.000
         234 测试供应商2 5H57161000002 计算器           2.000
         434 测试供应商3 5H52921000088 剪刀              4.000
         232 测试供应商3 5H48911000023 黑色水笔芯     2.000
        2432 测试供应商3 5H57161000002 计算器          2.000

发现正常情况下读取数据显示的是按照Sup_Name(供应商)作为列值显示。目前客户要求以物资为条件对各供应上报价进行汇总显示。接下来我们按照刚才提供的语法使用pivot来实现列转行。

  sql:select* from (select PRICE,Sup_Name,QUOT_ITEM1,QUOT_ITEM3,QUANTITY from
Q2B_QUOT_ITEM where <相关条件筛选> as <别名>

pivot (max(PRICE) for ord.Sup_Name in (测试供应商1,测试供应商3,测试供应商2)) b

显示:QUOT_ITEM1 QUOT_ITEM3 QUANTITY 测试供应商1 测试供应商3 测试供应商2
      5H48911000023 黑色水笔芯     2.000          422          232          342
      5H52921000088 剪刀              4.000          342          434          324
       5H57161000002 计算器          2.000          211         2432          234

 使用pivot很简单的实现了列转行,对于类似的数据处理灰常灰常的实用,避免了使用case when 或者循环游标的复杂处理,大大提高了处理速度和代码整洁优雅。

注意事项: 1.对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高;

                2.UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行,但是也不是完全的相同,PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的空值不会显示在输出中,而在执行 PIVOT 操作之前,输入中可能有原始的空值。

               3.动态处理和静态处理不一样的地方在于列转行的数量。也就是FOR … in 包含的数据。

 最后简单写一下:UNPIVOT用于将列名转为列值(即列转行)

语法:

UNPIVOT(

value_column

FOR  pivot_column

IN(<column_list>)

)

简单测试了一下,待以后有实际应用再把实际例子复制过来。不继续深入探讨了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119763.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月24日 下午10:00
下一篇 2021年11月24日 下午10:00


相关推荐

  • python小项目:3、九九乘法表与斐波那契数列

    python小项目:3、九九乘法表与斐波那契数列

    2021年10月6日
    40
  • php 生成订单号201807205598981

    php 生成订单号201807205598981

    2021年11月8日
    48
  • java中Arrays.sort()的几种用法

    java中Arrays.sort()的几种用法Java 的 Arrays 类中有一个 sort 方法 该方法是 Arrays 类的静态方法 在需要对数组进行排序时 非常的好用 但是 sort 的参数有好几种 下面我就为大家一一介绍 这几种形式的用法 1 Arrays sort int a 这种形式是对一个数组的所有元素进行排序 并且是

    2026年3月18日
    2
  • python:获取当前日期时间

    python:获取当前日期时间方法利用 datetime 模块 importdateti datetime datetime now strftime Y m d H M S print now 输出 2020 08 2022 54 57 使用场景保存文件时 利用当前时间生成文件名

    2026年3月17日
    3
  • java工厂模式实例(设计模式)「建议收藏」

    java工厂模式实例(设计模式)「建议收藏」java工厂模式开篇声明,此理解为作者自身理解,不一定正确,如有错误请大佬们指正。工厂模式,在作者看来,从现实生活来说,就是一个工厂,里面有N个车间,每个车间会生产不同的产品,而租户只需要告诉这个工厂的老板我需要一个什么产品,老板会去找到对应的车间返回给租户使用。画个图理解:如果使用java语言来描述则是,对具有相同动作,不同动作执行过程的一类方法抽象出一个接口类,然后不同的实现类对接口类中的接口进行不同的实现,并且编写一个工厂类,根据传入获取不同的实现类实例返回给调用者

    2022年7月20日
    14
  • app软件开发的基本流程_app项目开发流程

    app软件开发的基本流程_app项目开发流程 本文转载自互联网,如有侵权,请联系我及时删除。谢谢。(一)项目启动前  从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为做项目管理跟踪项目进度,有的是做竞品分析给老板看。实际上,这些都不是产品经理的核心和重点。在较为成熟的企业,因为产品的壮大和人员的增多,…

    2025年6月26日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号