【问题标题】:Using Row Number to Partition data使用行号对数据进行分区
【发布时间】:2012-04-22 07:17:25
【问题描述】:

好的,这是我断定我迷路的情况之一。

我有一张如下所示的表格:

我写了以下代码:

WITH CTE AS(
SELECT 
 USER_NBR
,CASE WHEN MOVIE_TYPE = 'Action'      THEN MOVIE_NAME END [ACTION]                        
,CASE WHEN MOVIE_TYPE = 'Drama'       THEN MOVIE_NAME END DRAMA
,CASE WHEN MOVIE_TYPE = 'Romance'     THEN MOVIE_NAME END ROMANCE
,ROW_NUMBER() OVER (PARTITION BY  USER_NBR ORDER BY  USER_NBR) AS OCCURANCE
FROM dbo.MOVIE)

SELECT * FROM CTE WHERE OCCURANCE = 1

我得到这个结果:

我不明白为什么我在查询结果中得到空值?

我做错了什么?如您所见,我正在对电影进行分类。

感谢您查看此内容

【问题讨论】:

  • 您期望NULL-valued 列中的值是多少?
  • 漂亮女人和真爱。属于该类别的两部电影。谢谢!
  • 所以您正试图在单行上显示user_nbr 的每种类型的“第一个”(尽管在您的查询中没有明确的顺序定义)movie
  • 删除条件occurance = 1 以获得更清晰的图片...查看您在同一列值上的案例条件...如果 movie_type Drama 那么您的输出查询将在 DRAMA 列中没有值。 .
  • 你的意思是做一个支点然后......

标签: sql sql-server database pivot


【解决方案1】:

也许这种方法对你有用。通常,当您将行值转换为列时(例如示例中的电影类型),它是一个枢轴函数(参考 http://msdn.microsoft.com/en-us/library/ms177410.aspx

select * from 
(select user_nbr, movie_name, movie_type from movies) as movies
pivot 
(max(movie_name)
    for movie_type in ([Action], [Drama], [Romance])
)
as PivotTable

结果:

user_nbr   Action             Drama           Romance
101        Casino Royale    Pretty Woman    Love Actually
102        Casino Royale    Pretty Woman    Love Actually

【讨论】:

  • 这也很有效:那么我如何将它插入到具有实际动作、戏剧和浪漫列的新表中?
  • @UnaverageGuy,你可以这样做:INSERT INTO new_table (user_nbr, action, Drama, romance) SELECT * FROM (...)
【解决方案2】:

请注意,如果您尝试获得这种类型的输出,则必须使用 group by 子句..

如果你想获得所有类别的价值,那么你可以尝试以下查询..

WITH CTE AS(
SELECT 
 USER_NBR
,CASE WHEN MOVIE_TYPE = 'Action'      THEN MOVIE_NAME END [ACTION]                        
,CASE WHEN MOVIE_TYPE = 'Drama'       THEN MOVIE_NAME END DRAMA
,CASE WHEN MOVIE_TYPE = 'Romance'     THEN MOVIE_NAME END ROMANCE
,count(*) AS OCCURANCE
FROM dbo.MOVIE
 group by USER_NBR
)
SELECT * FROM CTE 

我认为这就是你想要做的..

【讨论】:

  • 您指出的代码不是显示单行而是显示所有数据,不是我想要的,但谢谢!
  • 已解决!我需要做的就是将 MAX 添加到每个 CASE 和 CTE 块中的 GROUP BY USER_NBR。没有更多的空值!谢谢大家!
猜你喜欢
  • 2019-07-08
  • 2023-03-17
  • 1970-01-01
  • 2017-04-28
  • 2023-03-30
  • 2022-07-29
  • 2018-05-14
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多