T-SQL 实现行转列

Posted BI Information

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于T-SQL 实现行转列的主要内容,如果未能解决你的问题,请参考以下文章

T-sql 行转列,数据库查询分页

SQLpivot(行转列)unpivot(列转行)apply

通过sql实现动态行转列

SQLSERVER有张表,需要每晚自动实现行转列。

ORAClE sql如何实现行转列?

SQL sql语句实现行转列的3种方法