zoukankan      html  css  js  c++  java
  • SQL数据透视

        透视是一种通过聚合和旋转把数据行转换成数据列的技术。当透视数据时,需要确定三个要素:要在行(分组元素)中看到的元素,要在列(扩展元素)上看到的元素,要在数据部分看到的元素(聚合元素)。

    SQL Server数据库中,PIVOT在帮助中这样描述滴:可以使用 PIVOT 和UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

    数据表如下所示:

    with C as
    (
    select YEAR(orderdate) as orderyear,MONTH(orderdate) AS ordermonth,val
    from Sales.OrderValues
    )
    select *
    from C
      PIVOT(sum(val) 
        for ordermonth in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as P

    扩展一下,为每一个顾客返回最近的5此订单的订单信息

    with C as
    (
    select custid,val,ROW_NUMBER() over(partition by custid order by orderdate desc,orderid desc) as rownum
    from Sales.OrderValues
    )
    
    select * 
    from C
      PIVOT(max(val) for rownum in ([1],[2],[3],[4],[5])) as P

    如果我们需要把每个客户的最近的5分订单ID链接一个字符串,可以使用2012中心的concat函数

    CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3,等字串连在一起。

    with C as
    (
    select custid,CAST(orderid as varchar(11)) as sorderid,ROW_NUMBER() over(partition by custid order by orderdate desc,orderid desc) as rownum
    from Sales.OrderValues
    )
    
    select custid,CONCAT([1],','+[2],','+[3],','+[4],','+[5]) as orderids 
    from C
      PIVOT(max(sorderid) for rownum in ([1],[2],[3],[4],[5])) as P

    https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx

    这是PIVOT相关文档说明

  • 相关阅读:
    spark SQL之 DataFrame和DataSet
    scala之 保留小数
    spark之 避免数据倾斜之 给名字分区(百家姓)
    hive之 'client_protocol' is unset!
    hive之报错:ls:cannot access '/usr/local/spark/lib/spark-assembly-*.jar':No such file or directory
    hive之 Error: Duplicate key name 'PCS_STATS_IDX' (state=42000,code=1061) ----Hive schematool -initSchema
    Maven中需要注意的点
    spark之 Idea操作
    scala之 一句话打印三角形
    scala 之 BaseDao
  • 原文地址:https://www.cnblogs.com/xiaopotian/p/6817677.html
Copyright © 2011-2022 走看看