SQL:带占位符行的数据透视表
SQL: Pivot with placeholder rows
我有一个 table 可以为节目的剧集存储一行。请注意,并非每一集都被存储。
showID | viewerID | episodeNumber | episodeDescription
____________________________________________________________________
15 | ID-123 | 1 | Scary
____________________________________________________________________
15 | ID-123 | 3 | Funny
我构建了一个数据透视查询来为剧集编号和描述创建列。剧集数是已知数量。
showID | viewerID | episode1 | episode2 | episode3
__________________________________________________________________________
15 | ID-123 | Scary | funny |
我的问题是,在没有记录的情况下,如本例所示,第一个 table 中缺少第 2 集的行,查询不会创建 "place holder" 而是将 episode3 的数据放入 episode2 列。我什至不知道我需要的东西是否可行——但我确实需要以某种方式确保剧集编号与正确的描述相关联,因为剧集编号没有数据(无行),而且我确实需要在 table 2 中为每一集显示一个列(因此在上面的 table 2 中,第 2 集的字段应该是空白的)。
我的查询如下:
SELECT viewerID, showID,
episodeDescription1, episodeDescription2, episodeDescription3
FROM
(
SELECT viewerID, showID, col+cast(seq as varchar(10)) as col, value
from
(
SELECT viewerID, showID, episodeNumber, episodeDescription,
row_number() over(partition by showID
order by episodeNumber) seq
FROM tbl_showEpisodes
) d
CROSS APPLY
(
SELECT 'episodeNumber', cast(episodeNumber as varchar(20))
UNION ALL
SELECT 'episodeDescription', episodeDescription
) c (col, value)
) src
pivot
(
MAX(value)
for col in (
episodeNumber1, episodeDescription1, episodeNumber2,
episodeDescription2, episodeNumber3, episodeDescription3)
) piv;
我希望这是清楚的,并在此先感谢您的帮助!使用 SQL Server 2012。
您可以通过这种方式旋转它:
create table tbl_showEpisodes (showID int, viewerID varchar(30), episodeNumber int, episodeDescription varchar(30));
insert into tbl_showEpisodes values
(15, 'ID-123', 1, 'Scary'),
(15, 'ID-123', 3, 'Funny');
GO
SELECT showID, viewerID, [Episode 1], [Episode 2], [Episode 3]
FROM (SELECT showID,
viewerID,
CONCAT('Episode ', episodeNumber) epNumber,
episodeDescription
FROM tbl_showEpisodes) src
PIVOT (MAX(episodeDescription)
FOR epNumber
IN ([Episode 1],[Episode 2],[Episode 3])) pvt
GO
showID | viewerID | Episode 1 | Episode 2 | Episode 3
-----: | :------- | :-------- | :-------- | :--------
15 | ID-123 | Scary | null | Funny
dbfiddle here
我有一个 table 可以为节目的剧集存储一行。请注意,并非每一集都被存储。
showID | viewerID | episodeNumber | episodeDescription
____________________________________________________________________
15 | ID-123 | 1 | Scary
____________________________________________________________________
15 | ID-123 | 3 | Funny
我构建了一个数据透视查询来为剧集编号和描述创建列。剧集数是已知数量。
showID | viewerID | episode1 | episode2 | episode3
__________________________________________________________________________
15 | ID-123 | Scary | funny |
我的问题是,在没有记录的情况下,如本例所示,第一个 table 中缺少第 2 集的行,查询不会创建 "place holder" 而是将 episode3 的数据放入 episode2 列。我什至不知道我需要的东西是否可行——但我确实需要以某种方式确保剧集编号与正确的描述相关联,因为剧集编号没有数据(无行),而且我确实需要在 table 2 中为每一集显示一个列(因此在上面的 table 2 中,第 2 集的字段应该是空白的)。
我的查询如下:
SELECT viewerID, showID,
episodeDescription1, episodeDescription2, episodeDescription3
FROM
(
SELECT viewerID, showID, col+cast(seq as varchar(10)) as col, value
from
(
SELECT viewerID, showID, episodeNumber, episodeDescription,
row_number() over(partition by showID
order by episodeNumber) seq
FROM tbl_showEpisodes
) d
CROSS APPLY
(
SELECT 'episodeNumber', cast(episodeNumber as varchar(20))
UNION ALL
SELECT 'episodeDescription', episodeDescription
) c (col, value)
) src
pivot
(
MAX(value)
for col in (
episodeNumber1, episodeDescription1, episodeNumber2,
episodeDescription2, episodeNumber3, episodeDescription3)
) piv;
我希望这是清楚的,并在此先感谢您的帮助!使用 SQL Server 2012。
您可以通过这种方式旋转它:
create table tbl_showEpisodes (showID int, viewerID varchar(30), episodeNumber int, episodeDescription varchar(30)); insert into tbl_showEpisodes values (15, 'ID-123', 1, 'Scary'), (15, 'ID-123', 3, 'Funny'); GO
SELECT showID, viewerID, [Episode 1], [Episode 2], [Episode 3] FROM (SELECT showID, viewerID, CONCAT('Episode ', episodeNumber) epNumber, episodeDescription FROM tbl_showEpisodes) src PIVOT (MAX(episodeDescription) FOR epNumber IN ([Episode 1],[Episode 2],[Episode 3])) pvt GO
showID | viewerID | Episode 1 | Episode 2 | Episode 3 -----: | :------- | :-------- | :-------- | :-------- 15 | ID-123 | Scary | null | Funny
dbfiddle here