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

时间:2021-10-11 23:42:56

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. Thanks!

如何将存储为多行的字段转换为列?我还列出了下面的代码。下面是一个需要的示例,但它实际上可以增加到20列。谢谢!

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

2 个解决方案

#1


2  

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/

#2


1  

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

#1


2  

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/

#2


1  

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