AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 122665
Accepted
MrVimes
MrVimes
Asked: 2015-12-03 05:53:21 +0800 CST2015-12-03 05:53:21 +0800 CST 2015-12-03 05:53:21 +0800 CST

Unpivot 将行转换为列以及将列转换为行

  • 772

我试图理解网络上的 unpivot 示例,但它们并没有完全导致我想要做的事情,即将特定的行变成列,将列变成行。为了尝试说明我的意思,我附上了一张图片......

在此处输入图像描述

我相信给定列中的数据需要是相同的类型,所以如果是这种情况,那么将所有列都设置为 varchar 是可以的。源表中的数据不需要是任何总和的一部分,只需按原样显示。我只是想“旋转”它以垂直方式显示数据以供最终用户使用。

sql-server-2005 t-sql
  • 1 1 个回答
  • 1923 Views

1 个回答

  • Voted
  1. Best Answer
    Julien Vavasseur
    2015-12-03T06:16:02+08:002015-12-03T06:16:02+08:00

    此查询同时使用UNPIVOT和 PIVOT:

    SELECT piv.[Data], piv.x, piv.y
    FROM (
        SELECT [Type], ColA = CAST(ColA as varchar(10)), ColB = CAST(ColB as varchar(10)), ColC = CAST(ColC as varchar(10)), ColD = CAST(ColD as varchar(10))
        FROM @data
    ) d
    UNPIVOT (
        [value] FOR [Data] IN (ColA, ColB, ColC, ColD)
    ) as unpiv
    PIVOT (
        MAX([value]) 
        FOR [Type] IN ([x], [y])
    ) as piv
    ;
    
    • 它首先对您的数据进行反透视以获得常规表
    • 然后它将这个表转回新的所需格式

    我必须将所有内容都转换为 varchar。根据您的数据模型,您可能必须将它们转换为另一种类型。PIVOT 需要聚合函数。由于这是一对一的匹配,它适用于 MAX 或 MIN。

    使用SQL Server >= 2008,您还可以将UNPIVOT替换为Table Value Constructor和CROSS APPLY以及PIVOT:

    SELECT piv.[Data], piv.x, piv.y
    FROM (
        SELECT v.[Type], [value], [Data]
        FROM @data d
        CROSS APPLY (values
            (d.[type], CAST(d.ColA as varchar(10)), 'ColA')
            , (d.[type], CAST(d.ColB as varchar(10)) , 'ColB')
            , (d.[type], CAST(d.ColC as varchar(10)), 'ColC')
            , (d.[type], CAST(d.ColD as varchar(10)), 'ColD')
        ) as v([type], [value], [Data])
    ) unpiv
    PIVOT (
        MAX([value])
        FOR [Type] IN ([x], [y])
    ) as piv
    ;
    

    如果没有PIVOT / UNPIVOT,您可以将此查询与任何(旧)版本的 SQL Server 一起使用:

    SELECT [Data]
        , [x] = MAX(CASE WHEN [type] = 'x' THEN [value] END)
        , [y] = MAX(CASE WHEN [type] = 'y' THEN [value] END)
    FROM (
        SELECT [type], [value] = CAST(ColA as varchar(10)), [Data] = 'ColA' FROM @data
        UNION ALL
        SELECT [type], [value] = CAST(ColB as varchar(10)), [Data] = 'ColB' FROM @data
        UNION ALL
        SELECT [type], [value] = CAST(ColC as varchar(10)), [Data] = 'ColC' FROM @data
        UNION ALL
        SELECT [type], [value] = CAST(ColD as varchar(10)), [Data] = 'ColD' FROM @data
    ) as v
    GROUP BY [Data]
    

    输出:

    Data    x       y
    ColA    123456  654321
    ColB    $500    $200
    ColC    6       36
    ColD    30      90
    

    数据:

    Declare @data table([Type] char(1), ColA bigint, ColB varchar(10), ColC int, ColD int);
    INSERT INTO @data([Type], ColA, ColB, ColC, ColD) VALUES
        ('x', 123456, '$500', 6, 30)
        , ('Y', 654321, '$200', 36, 90);
    
    • 4

相关问题

  • SQL Server 2005 中可空列的唯一约束

  • 如何更改触发器的触发顺序?

  • 有人在实践中使用过 sqlcmd 模式吗?[关闭]

  • 如何在不安装新实例的情况下更改 MS SQL 2005 中的实例名称?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve