【问题标题】:Unpivoting movie genres不折不扣的电影类型
【发布时间】:2015-11-18 09:17:48
【问题描述】:

我正在查看来自 IMDb 的一些电影数据,我发现我的知识存在局限性。这是我正在查看的数据:

我想我会遇到这个当前表的问题。我怎样才能得到它,以便有两列,MovieID 和 Genre?然后它会导致 MovieID 不明显。这需要反透视吗?

任何帮助将不胜感激!

【问题讨论】:

  • 最简单的选择是只存储具有该类型的那些(而不是电影“x”不是“喜剧”)所以,你可以做类似@987654323 @
  • 听起来你想真正正确地规范化它。对此表示敬意。是的,从长远来看,这种表结构会给你带来痛苦。处理此问题的最佳方法是将其拆分为三个表。一个用于电影信息。第二张流派表。第三个表包含 MovieID 和 GenreID 的复合键。

标签: sql sql-server unpivot imdb


【解决方案1】:

我确实认为 UNPIVOT 会为您提供您所追求的那种东西。像这样的东西应该可以工作(我故意将示例简化为仅包含三种类型,但您应该能够从我所做的事情中得到这个想法):-

SELECT MovieID, Genre, [Count]
FROM 
    (SELECT MovieID, Crime, Comedy, Drama --comma separated list of the genres
    FROM MovieGenres) p
UNPIVOT
    ([Count] FOR Genre IN 
        (Crime, Comedy, Drama) --list genres again
    ) as upvt

SQLFIDDLE

如果您只想显示值为 1 的流派/电影 ID,那么这是在上面添加 WHERE 子句的简单案例:-

SELECT MovieID, Genre, [Count]
FROM 
    (SELECT MovieID, Crime, Comedy, Drama --list your genres here
    FROM #MovieGenres) p
UNPIVOT
    ([Count] FOR Genre IN 
        (Crime, Comedy, Drama) --list genres again, same order
    ) as upvt
WHERE [Count] = 1

【讨论】:

    【解决方案2】:

    我看不到您的屏幕截图,所以我猜测列,但大致如下:

    SELECT MovieID, "Horror" As Genre
    WHERE Horror = 1
    UNION ALL
    SELECT MovieID, "Comedy" As Genre
    WHERE Comedy = 1
    UNION ALL
    SELECT MovieID, "Drama" As Genre
    WHERE Drama = 1
    UNION ALL
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多