Sql server 将行值用作列,将列用作行

Sql server 将行值用作列,将列用作行,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试创建一个查询,其中我使用pivot将行值转换为列。我能做得很好。但要求还使用其他列作为行值 可以检查我尝试过的表和查询。 所需的输出为 从查询中,我需要将“C”的值作为列,然后将其他列(A、B、D&E)作为第一列的行值 是否可以使用一个pivot查询来显示所需的输出?如果没有,解决问题的最佳方法是什么? MS SQL Server 2008架构设置: CREATE TABLE Table1 ( A varchar(10), B varchar(10), C in

我正在尝试创建一个查询,其中我使用pivot将行值转换为列。我能做得很好。但要求还使用其他列作为行值

可以检查我尝试过的表和查询。 所需的输出为

从查询中,我需要将“C”的值作为列,然后将其他列(A、B、D&E)作为第一列的行值

是否可以使用一个pivot查询来显示所需的输出?如果没有,解决问题的最佳方法是什么?

MS SQL Server 2008架构设置

CREATE TABLE Table1
(
    A varchar(10),
    B varchar(10),
    C int,
    D varchar(10),
    E varchar(10)
)

GO

INSERT INTO Table1 VALUES('A1', 'B1', 1, 'D1', 'E1');
INSERT INTO Table1 VALUES('A2', 'B2', 2, 'D2', 'E2');
INSERT INTO Table1 VALUES('A3', 'B3', 3, 'D3', 'E3');
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME(C) 
                       from Table1
                       group by C
                       order by C
                       FOR XML PATH(''), TYPE
                      ).value('.', 'NVARCHAR(MAX)') 
                      ,1,1,'')

set @query = N';WITH CTE AS
(SELECT *
FROM Table1 UNPIVOT (Vals FOR COLUMNNAMES IN (A,B,D,E))up
)
SELECT *
FROM CTE 
  PIVOT (MAX(Vals)
         FOR C
         IN(' + @cols + N'))p '

exec sp_executesql @query
| COLUMNNAMES |  1 |  2 |  3 |
|-------------|----|----|----|
|           A | A1 | A2 | A3 |
|           B | B1 | B2 | B3 |
|           D | D1 | D2 | D3 |
|           E | E1 | E2 | E3 |
查询1

CREATE TABLE Table1
(
    A varchar(10),
    B varchar(10),
    C int,
    D varchar(10),
    E varchar(10)
)

GO

INSERT INTO Table1 VALUES('A1', 'B1', 1, 'D1', 'E1');
INSERT INTO Table1 VALUES('A2', 'B2', 2, 'D2', 'E2');
INSERT INTO Table1 VALUES('A3', 'B3', 3, 'D3', 'E3');
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME(C) 
                       from Table1
                       group by C
                       order by C
                       FOR XML PATH(''), TYPE
                      ).value('.', 'NVARCHAR(MAX)') 
                      ,1,1,'')

set @query = N';WITH CTE AS
(SELECT *
FROM Table1 UNPIVOT (Vals FOR COLUMNNAMES IN (A,B,D,E))up
)
SELECT *
FROM CTE 
  PIVOT (MAX(Vals)
         FOR C
         IN(' + @cols + N'))p '

exec sp_executesql @query
| COLUMNNAMES |  1 |  2 |  3 |
|-------------|----|----|----|
|           A | A1 | A2 | A3 |
|           B | B1 | B2 | B3 |
|           D | D1 | D2 | D3 |
|           E | E1 | E2 | E3 |

CREATE TABLE Table1
(
    A varchar(10),
    B varchar(10),
    C int,
    D varchar(10),
    E varchar(10)
)

GO

INSERT INTO Table1 VALUES('A1', 'B1', 1, 'D1', 'E1');
INSERT INTO Table1 VALUES('A2', 'B2', 2, 'D2', 'E2');
INSERT INTO Table1 VALUES('A3', 'B3', 3, 'D3', 'E3');
DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME(C) 
                       from Table1
                       group by C
                       order by C
                       FOR XML PATH(''), TYPE
                      ).value('.', 'NVARCHAR(MAX)') 
                      ,1,1,'')

set @query = N';WITH CTE AS
(SELECT *
FROM Table1 UNPIVOT (Vals FOR COLUMNNAMES IN (A,B,D,E))up
)
SELECT *
FROM CTE 
  PIVOT (MAX(Vals)
         FOR C
         IN(' + @cols + N'))p '

exec sp_executesql @query
| COLUMNNAMES |  1 |  2 |  3 |
|-------------|----|----|----|
|           A | A1 | A2 | A3 |
|           B | B1 | B2 | B3 |
|           D | D1 | D2 | D3 |
|           E | E1 | E2 | E3 |