当前位置: 首页 > 面试题库 >

SQL Server:列到行

栾昂雄
2023-03-14
问题内容

寻找优雅的(或任何)解决方案以将列转换为行。

这是一个示例:我有一个具有以下架构的表:

[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]

这是我想要得到的结果:

[ID] [EntityId] [IndicatorName] [IndicatorValue]

结果值为:

1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'

等等..

这有意义吗?您对在哪里看以及如何在T-SQL中完成操作有任何建议吗?


问题答案:

您可以使用UNPIVOT函数将列转换为行:

select id, entityId,
  indicatorname,
  indicatorvalue
from yourtable
unpivot
(
  indicatorvalue
  for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;

请注意,要取消透视的列的数据类型必须相同,因此您可能必须在应用取消透视之前转换数据类型。

您还可以CROSS APPLY与UNION ALL一起使用来转换列:

select id, entityid,
  indicatorname,
  indicatorvalue
from yourtable
cross apply
(
  select 'Indicator1', Indicator1 union all
  select 'Indicator2', Indicator2 union all
  select 'Indicator3', Indicator3 union all
  select 'Indicator4', Indicator4 
) c (indicatorname, indicatorvalue);

根据您的SQL Server版本,您甚至可以将CROSS APPLY与VALUES子句一起使用:

select id, entityid,
  indicatorname,
  indicatorvalue
from yourtable
cross apply
(
  values
  ('Indicator1', Indicator1),
  ('Indicator2', Indicator2),
  ('Indicator3', Indicator3),
  ('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);

最后,如果您有150列要取消透视,并且您不想对整个查询进行硬编码,则可以使用动态SQL生成sql语句:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.column_name)
           from information_schema.columns as C
           where C.table_name = 'yourtable' and
                 C.column_name like 'Indicator%'
           for xml path('')), 1, 1, '')

set @query 
  = 'select id, entityId,
        indicatorname,
        indicatorvalue
     from yourtable
     unpivot
     (
        indicatorvalue
        for indicatorname in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;


 类似资料:
  • 如何将行交换到列,我有一个输出,如 我需要一个输出比如

  • 本文向大家介绍SQLServer行转列实现思路记录,包括了SQLServer行转列实现思路记录的使用技巧和注意事项,需要的朋友参考一下 最近面试遇到了一道面试题,顿时有点迷糊,只说出了思路,后来百度了一下,整理了一下思路,于是记录下来,方便以后学习。(面试题请参见附件) 相关的数据表: 1.Score表   2.[User]表   SQL语句如下: --方法一:静态SQL --方法二:动态SQL

  • 问题内容: 我是Sql的新手,但是将excel文档中的1000多个行插入到我的数据库中的最佳方法是什么(Sql Server2008。) 例如,我正在使用以下查询: 这很好用,但是插入1000条记录是有限制的,我有19000条记录,我真的不想做19条单独的插入语句,还有另一个问题,那就是公司ID总是相同的,那么有没有更好的方法呢写了19000次吗? 问题答案: Microsoft提供了带有SQL

  • node-sqlserver 是微软官方发布的 SQL Server 的 Node.js 的驱动程序。可允许 Windows 上运行的 Node.js 程序访问 SQL Server 和 Windows Azure SQL 数据库。 该项目托管在 Github 上。

  • sqlserver manager 是一个多功能sqlserver图形管理界面,支持自定义导入导出,自动扫描服务器,数据库。  

  • 主要内容:第1节. 查询数据,第2节. 对数据进行排序,第3节. 限制返回行数,第4节. 过滤数据,第5节. 连接表,第6节. 分组数据,第7节. 子查询,第8节. 集合运算符,第9节. 修改数据,第10节. 数据定义,第11节. SQL Server数据类型,第12节. 约束MS SQL Server是Microsoft开发的关系数据库管理系统(RDBMS)。 本产品专为存储其他应用程序所需的检索数据的基本功能而构建。 它可以在同一台计算机上运行,也可以在网络上运行。 本教程介绍了SQL Se

  • 我在Wamp上使用symfony2,它连接在SQL服务器DB上。 当我开始与项目 一切都很好,速度很慢,但我的网站在127.0上还可以。0.1:8000,Doctrine2连接到sql server数据库时没有问题。 我的问题:当我localhost/MyProject/web/app_php.php(意味着我使用wamp而不是server: run)。Symfony抛出一个异常: PDOExc0

  • 官方的SQLServer数据库的JDBC驱动程序 驱动类名:com.microsoft.sqlserver.jdbc.SQLServerDriver URL格式:jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]