2012-04-22 9 views
0

これは、私が紛失したと判断した状況の1つです。行番号をパーティションデータに使用

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です私はクエリ結果にNullを取得していますか?

私は間違っていますか?ご覧のとおり、私は映画を分類しています。

+1

は、あなたがどのような価値を期待しています'NULL'値の列? –

+0

かわいい女性と愛実際に。そのカテゴリにある2つの映画。ありがとう! – Asynchronous

+0

それで、あなたは一行に 'user_nbr'によって各タイプの' movie'を "最初の"(クエリの順序の明確な定義はありませんが)表示しようとしていますか? –

答えて

3

たぶん、このアプローチがあなたのために動作します。あなたは(あなたの例では、映画のタイプのような)列に行の値を回しているときに一般的には、ピボット機能だ(参照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

これも完全に動作します:実際のアクション、ドラマ、ロマンスの列を持つ新しいテーブルにこれを挿入するにはどうしたらいいですか? – Asynchronous

+0

@UnaverageGuy、これを行うことができます:INSERT INTO new_table(user_nbr、action、drama、romance)SELECT * FROM(...) – McGarnagle

+0

チップをありがとう!! – Asynchronous

0

これをチェックアウトするためのおかげで、あなたは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 

私は、これはあなたがやろうとしているものだと思います..

+0

あなたが指定したコードは、1行だけではなく、すべてのデータを表示しますが、私が意図するものではありませんが、ありがとうございます! – Asynchronous

+0

解決済み!私がする必要があったのは、CTEブロックの各CASEとUSER_NBRにMAXを追加することだけでした。それ以上のヌルはありません!みんな、ありがとう! – Asynchronous