关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LiveWriter高亮显示方法专题「建议收藏」

    LiveWriter高亮显示方法专题「建议收藏」2013年9月26日花了一上午的时间,熟悉了LiveWriter的用法,学会了怎么配置语法高亮,总结下来。方法1.用博客园推荐的方法没有成功。pass方法2方法来自一个人的旅行.试过OK博客

    2022年7月2日
    26
  • 深入理解List的toArray()方法和toArray(T[] a)方法「建议收藏」

    深入理解List的toArray()方法和toArray(T[] a)方法「建议收藏」深入理解List的toArray()方法和toArray(T[]a)方法这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArray[T[]a]方法导出的是指定类型的数组。下面是两个方法的申明及说明,摘自Java8的API文档。toArray()方法的分析Object[]toArray()Returnsan…

    2022年5月15日
    44
  • 阿里巴巴Java开发手册(全册四版)

    阿里巴巴Java开发手册(全册四版)阿里官方Java代码规范标准《阿里巴巴Java开发手册2017/2018/2019/2020》小白必备!!!2017年9月25日,阿里巴巴Java开发手册正式发布,至今为止已更迭了四个版本,分别是2017(终极版)、2018(详尽版)、2019(华山版)、2020(泰山版),值得收藏。

    2022年7月7日
    32
  • Idea激活码教程2025.1.1.1永久有效激活码绝对有效2025.1.1.1

    Idea激活码教程2025.1.1.1永久有效激活码绝对有效2025.1.1.1Idea 激活码教程永久有效 2025 1 1 1 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2025 1 1 1 成功激活

    2025年5月21日
    6
  • idea永2021.2激活码破解方法

    idea永2021.2激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    45
  • 4g通信系统的网络结构_4g通信

    4g通信系统的网络结构_4g通信1、4G通信网络的关键技术研究4G通信网络,就必须加强对其关键技术的研究,这是决定4G网络通信与3G网络通信不同的关键因素,其主要包括正交频分复用技术、软件无线电技术、智能天线技术、多输入多输出技术、IP核心网技术和多用户检测技术等。1.1正交频分复用技术所谓的正交频分复用技术,简称OFDM技术,是4G通信网络的核心技术,主要是将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。OFDM技术不同于一般性的网络技术,它可以通过相关技术将信号分开,有

    2022年9月15日
    0

发表回复

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

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