zoukankan      html  css  js  c++  java
  • SQL UNPIVOT详解

    一、UNPIVOT:

      UNPIVOT与PIVOT正好相反,它把数据从列旋转到行

    例:

      首先将源数据显示出来,看一下:

      

      我们先把empid为1和2的2006年数据修改为null

    UPDATE dbo.EmpYearValues
      SET [2006] = NULL
    WHERE empid IN(1, 2);

      设置完成之后在查询源数据:如下:

      

      下面我们进行UNPIVOT操作:

    SELECT empid, orderyear, val
    FROM dbo.EmpYearValues
      UNPIVOT(val FOR orderyear IN([2006],[2007],[2008])) AS U;

      下面显示查询结果集:

      

    二、UNPIVOT操作涉及的逻辑处理阶段

      UNPIVOT涉及到以下三个逻辑阶段:

      1、生成副本

      2、提取元素

      3、删除带有NULL的行

      UNPIVOT的输入是左表表达式,第一步先为左表表达式中的行生成多个副本,要进行逆透视转换的每一列都会生成一个副本。因为这里的in子句中有三个列名称,所以要为每个来源行生成三个副本。结果得到的虚拟表将包含一个新列,用于以字符串格式保存来源列的名称。该列的名称是紧接在IN子句之前指定的名称(在这里也就是orderyear)。虚拟表部分(只显示empid为3、6、9的数据)如下:

      

      第二步从来源列中提取出于行的当前副本说代表的逆透视转换元素相对应的值。保存该值的目标列名称是紧接在for子句之前指定的(在这个例子中是val)。这个目标列将保存虚拟表中与当前行的订单年份相对应的列值。查询的虚拟表如下:

      

      第三部,也是最后一步将删除掉结果值列为null的行。

  • 相关阅读:
    servlet 将输入内容通过拼接页面的方式显示出来
    localstorage和vue结合使用
    vue的通讯与传递props emit (简单的弹框组件)
    jquery插件之选项卡
    详解Cookie纪要
    jsonp
    滚动条样式
    axios基本使用
    IOS安卓常见问题
    简单购物车
  • 原文地址:https://www.cnblogs.com/sundebin68/p/3435534.html
Copyright © 2011-2022 走看看