有几种方法可以转换此数据。在您原来的帖子中,您说这PIVOT
对于这种情况来说似乎太复杂了,但是可以很容易地使用SQL Server 中的UNPIVOT
和函数来应用它。PIVOT
但是,如果您无权访问这些函数,则可以使用UNION ALL
to复制此UNPIVOT
函数,然后使用带有CASE
语句 to的聚合函数PIVOT
:
创建表:
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
联合所有、聚合和案例版本:
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
请参阅带有演示的 SQL Fiddle
通过将列转换为单独的行来UNION ALL
执行数据。然后将聚合函数与语句一起应用以获取每个.UNPIVOT
Paul, John, Tim, Eric
sum()
case
color
Unpivot 和 Pivot 静态版本:
SQL Server 中的UNPIVOT
和函数都使这种转换变得更加容易。PIVOT
如果您知道要转换的所有值,则可以将它们硬编码为静态版本以获得结果:
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
请参阅带有演示的 SQL Fiddle
带有 的内部查询UNPIVOT
执行与 相同的功能UNION ALL
。它获取列列表并将其转换为行,PIVOT
然后执行最终转换为列。
动态枢轴版本:
如果您有未知数量的列(Paul, John, Tim, Eric
在您的示例中),然后有未知数量的颜色要转换,您可以使用动态 sql 生成列表UNPIVOT
,然后PIVOT
:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
请参阅带有演示的 SQL Fiddle
动态版本查询两者yourtable
,然后查询sys.columns
表以生成 和 的项目UNPIVOT
列表PIVOT
。然后将其添加到要执行的查询字符串中。动态版本的优点是如果您有一个不断变化的列表colors
和/或names
这将在运行时生成列表。
所有三个查询都将产生相同的结果:
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |