简体   繁体   English

如何在SQL Server中将许多行转换为列?

[英]How to convert many rows into Columns in SQL Server?

How would you convert a field that is stored as multiple rows into columns? 您如何将存储为多行的字段转换为列? I listed the code below as well. 我也在下面列出了代码。 Below is an example of what is needed but it can really go up to 20 columns. 以下是所需内容的示例,但实际上最多可以包含20列。 Thanks! 谢谢!

COL1  COL2  COL3
----------------
TEST  30    NY
TEST  30    CA
TEST2 10    TN 
TEST2 10    TX

I would like the output to be : 我希望输出为:

COL1  COL2  COL3  COL4
------------------------
TEST  30    NY    CA
TEST2 10    TN    TX


select * from (
    select
    ID,
    Name,
    STORE,
    Group,
    Type,
    Date,
    State,

        row_number() over(partition by ID, state order by Date desc) as rn
    from
        #test
) t
where t.rn = 1

There are multiple options to convert data from rows into columns. 有多个选项可将数据从行转换为列。 In SQL, you can use PIVOT to transform data from rows into columns. 在SQL中,可以使用PIVOT将数据从行转换为列。

CREATE table #tablename
  (Id int, Value varchar(10), ColumnName varchar(15);


INSERT INTO #tablename
  (ID,  Value, ColumnName)

VALUES
  (1, ‘Lucy’, 'FirstName'),
  (2, ‘James’, ‘LastName’),
  (3, ‘ABCDXX’, ‘Adress’),
  (4, ’New York’, ‘City’),
  (5, '8572685', ‘PhoneNo’);

select FirstName, LastName, Address, City, PhoneNo
from
(
 select Value, ColumnName
 from #tablename
) d
pivot
(
 max(Value)
 for ColumnName in (FirstName, LastName, Address, City, PhoneNo)
) piv;

Refer the below link for other options of transforming data from rows to columns: 请参阅以下链接,以获得将数据从行转换为列的其他选项:

https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/ https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/

declare @Table AS TABLE
(
    Col1 VARCHAR(100)   ,
    Col2 INT    ,
    Col3 VARCHAR(100)
)
INSERT @Table
        ( Col1, Col2, Col3 )
VALUES 
( 'TEST',  30    ,'NY'     ),
( 'TEST',  30    ,'CA'     ),
( 'TEST2',  10    ,'TN'     ),
( 'TEST2',  10    ,'TX'     )


SELECT 
    xQ.Col1,
    xQ.Col2,
    MAX(CASE WHEN xQ.RowNumber = 1 THEN xQ.Col3 ELSE NULL END) AS Col3,
    MAX(CASE WHEN xQ.RowNumber = 2 THEN xQ.Col3 ELSE NULL END) AS Col4
FROM
(
    SELECT * , RANK() OVER(PARTITION BY T.Col1,T.Col2 ORDER BY T.Col1,T.Col2,T.Col3) AS RowNumber
    FROM @Table AS T
)AS xQ
GROUP BY 
    xQ.Col1,
    xQ.Col2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM