2012-04-22 75 views
0

好吧,這是我已經斷定我迷路了的那些情況之一。使用行號分區數據

我有一個表,看起來像這樣:

enter image description here

我寫了下面的代碼:

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 

我得到這樣的結果:

enter image description here

我不明白的是wh我是否在查詢結果中得到空值?

我在做什麼錯?正如你所看到的,我正在分類電影。

感謝您檢查了這一點

+1

你在期待什麼樣的價值NULL值列? – 2012-04-22 07:20:27

+0

真的很漂亮的女人和愛。這兩類電影都屬於這一類別。謝謝! – Asynchronous 2012-04-22 07:22:15

+0

因此,您試圖通過'user_nbr'在單個行中顯示「第一個」(雖然在查詢中沒有明確的定單)每種類型的「電影」? – 2012-04-22 07:24:35

回答

3

也許這種方法會爲你工作。一般來說,當你打開行值到列中(就像在你的榜樣的電影類型),它是一個旋轉功能(REF 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 
+0

這也是完美的作品:那麼我怎樣才能將這個插入到一個新的表格中,並添加一個實際的Action,Drama和Romance專欄? – Asynchronous 2012-04-22 08:00:32

+0

@UnaverageGuy,你可以這樣做:INSERT INTO new_table(user_nbr,action,drama,romance)SELECT * FROM(...) – McGarnagle 2012-04-22 08:03:20

+0

感謝您的提示! – Asynchronous 2012-04-22 08:04:55

0

請注意,如果你想獲得這種類型的輸出必須通過子句中使用組..如果你想爲所有獲得價值

說類別,那麼你可以試試下面的查詢..

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 

我想這是你正在嘗試做的..

+0

您指定的代碼不顯示單行但包含所有數據,而不是我想要的,但謝謝! – Asynchronous 2012-04-22 07:40:08

+0

解決!我需要做的只是在CTE塊中爲每個CASE和GROUP BY USER_NBR添加MAX。沒有更多的空!感謝大家! – Asynchronous 2012-04-22 07:49:44