【问题标题】:SQL: Pivot with placeholder rowsSQL:使用占位符行进行透视
【发布时间】:2017-09-21 16:49:26
【问题描述】:

我有一个表,其中存储了一个节目剧集的一行。请注意,并非每一集都被存储。

showID    |    viewerID   |   episodeNumber    |    episodeDescription
____________________________________________________________________
15        |    ID-123     |      1             |    Scary
____________________________________________________________________
15        |    ID-123     |      3             |    Funny

我构建了一个透视查询来为剧集编号和描述创建列。剧集数是已知数量。

showID    |    viewerID    |    episode1    |    episode2    |    episode3 
__________________________________________________________________________
15         |   ID-123      |    Scary       |     funny       |     

我的问题是,在没有记录的情况下,如本例中第一个表中缺少第 2 集的行所示,查询不会创建“占位符”,而是将数据将第 3 集放入第 2 集列。我什至不知道我需要什么是可能的——但我确实需要以某种方式确保在剧集编号没有数据(无行)时,剧集编号与正确的描述相关联,我确实需要为表 2 中的每一集显示一列(因此在上面的表 2 中,episode2 的字段应为空白)。

我的查询如下:

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。

【问题讨论】:

    标签: sql sql-server-2012 pivot


    【解决方案1】:

    您可以通过这种方式对其进行 PIVOT:

    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
    
    节目ID |观众 ID |第 1 集 |第 2 集 |第 3 集 -----: | :------- | :-------- | :-------- | :-------- 15 | ID-123 |吓人 | |有趣的

    dbfiddle here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2017-08-03
      • 2018-09-07
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多