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