考虑下表:
id title genre1 genre2 genre3 genre4 genre5
1 Movie1 Thriller Crime NULL NULL NULL
2 Movie2 Fantasy NULL NULL NULL NULL
3 Movie3 Political Philosophical Historical NULL NULL
4 Movie4 Science Fiction NULL NULL NULL NULL
当我取消透视流派1、流派2、...时,NULL 值被删除,例如,Movie1 的行将是:
id title genre original_column
1 Movie1 Thriller genre1
1 Movie1 Crime genre2
有没有办法包含 NULL 值,例如:
id title genre original_column
1 Movie1 Thriller genre1
1 Movie1 Crime genre2
1 Movie1 NULL genre3
1 Movie1 NULL genre4
1 Movie1 NULL genre5
我可以SELECT ISNULL(genre1, '*'), ISNULL(genre2, '*') ...
,但假设我希望这些值显示为 NULL?有没有比以下更好的方法:
WITH
-- SELECT that unpivots table
AS unpivoted
SELECT unpivoted.id,
unpivoted.title,
,CASE unpivoted.genre WHEN '*' THEN NULL ELSE unpivoted.genre END
,unpivoted.original_transaction
FROM unpivoted
另外,我注意到返回要取消透视的源数据的查询必须有一个别名。例如:
SELECT ... FROM
-- *must* give it an alias or it's a syntax error
(SELECT ... FROM) AS source
UNPIVOT(genre for original_column IN (genre1,genre2, genre3,genre4,genre5))
有谁知道为什么?我还没有找到在查询中的任何地方引用别名的方法。
您可以在交叉应用中执行 unpivot 以获得您想要的结果。
如果您使用的是 SQL Server 2008 或更高版本,则可以使用表值构造函数,而不是
union all
Vladimir Baranov 在评论中建议的那样。