T-SQL 实现行转列

问题:

我正在寻找一种有效的方式将行转换为SQL服务器中的列

例如,通过下表如何构建出预期结果表。

Id  Value   ColumnName

1   John    FirstName

2   2.4     Amount

3   ZH1E4A  PostalCode

4   Fork    LastName

5   857685  AccountNumber

预期结果

FirstName   Amount  PostalCode      LastName    AccountNumber
John        2.4     ZH1E4A          Fork        857685

解答:

有多种方法可以将数据从多行转换为列。 在SQL Server中,可以使用PIVOT函数将数据从行转换为列:

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

如果您有未知数目的列名称要转置,那么您可以使用动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)
 
select @cols = STUFF((SELECT ‘,‘ + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(‘‘), TYPE
            ).value(‘.‘, ‘NVARCHAR(MAX)‘) 
        ,1,1,‘‘)
 
set @query = N‘SELECT ‘ + @cols + N‘ from 
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for ColumnName in (‘ + @cols + N‘)
            ) p ‘
 
exec sp_executesql @query;
如果不想使用PIVOT函数,则可以使用带有CASE表达式的聚合函数:
 
select
  max(case when columnname = ‘FirstName‘ then value end) Firstname,
  max(case when columnname = ‘Amount‘ then value end) Amount,
  max(case when columnname = ‘PostalCode‘ then value end) PostalCode,
  max(case when columnname = ‘LastName‘ then value end) LastName,
  max(case when columnname = ‘AccountNumber‘ then value end) AccountNumber
from yourtable
时间: 2024-08-10 01:55:39

T-SQL 实现行转列的相关文章

SQL Server 行转列

语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现 完整语法: table

做图表统计你需要掌握SQL Server 行转列和列转行

说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成前端图表需要的数据源,但是程序里又需要把该数据经过列转行写入中间表中,下次再查询该数据时直接从中间表查询数据. 1.1 列换行语法 table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 1.2  行转列案例

sql的行转列(PIVOT)与列转行(UNPIVOT)

在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SE

sql server 行转列(转载)

SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

sql的行转列和列转行

一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SELECT '张三', '语文', 80 INSERT INTO [StudentScores] SELECT '张三', '数学', 90 INSERT INTO [StudentS

SQL Server 行转列,列转行

一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + value FROM A WHERE name = Test.name FOR XML PATH('') ), 1, 1, '') ) FROM A AS Test GROUP BY name; PS:STUFF语句就是为了去掉第一个[逗号] 附STUFF用法:(从原字符的第二个开始共三个字符替换为后面的字符)

Sql 动态行转列 pivot

最近朋友有个需求:将产品中为“期刊”的书品以行转列的形式展现,同时需要关联工单主表及工单明细表,显示内容为,工单号.操作日期.产品名称及数量,由于期刊的产品数量较多,静态的虽然可以实现,但不利于后续内容的添加,就想着如何能以动态的形式展现,自动拼接sql语句处理,具体实现过程如下. 产品信息表需用到的字段内容: select ProductCode,Name from ComProduct where ProductType ='20' 工单需要用到的内容: select JobNo,Produ

SQL Server行转列

在很多情况下需要查询出来的数据进行行转列,看如下的例子,#t是一个临时表,可以换成真实存在的表: --头部信息,这部分不参与行转列DECLARE @SqlText NVARCHAR(4000)='SELECT DeviceName 货机名称, DeviceAddress 货机地址,CONVERT(VARCHAR(10), ReplenishmentCreatedDate, 20) 时间, ' -- SQL头部分 SELECT --行转列如下:可以重命名字段名,列头用其中一个列生成,列信息用另一个

SQL server 行转列 列转行

1.简单案例 create database Hang go use Hang create table Students ( Name varchar(50), Kemu varchar(50), sor int ) insert into Students values('张三','语文',8888) insert into Students values('张三','语文',85) insert into Students values('张三','数学',75) insert into

sql多行多列重复

在sql的查询中我们会遇到查询的结果比如这样的: 查询这张表的sql语句: select r.ROLE_NAME,u.USERID,u.USERNAME,u.TrueName from BASE_USERINFOR u left join BASE_USERROLE ur on u.USERID=ur.USER_ID left join BASE_ROLEINFOR r on r.ROLE_ID=ur.ROLE_ID 就拿钱三行来说就一个ROLE_NAME不一样其他的列的数值都是一样的难道我们就