2016-08-07 2 views
0

参考にならないタイトルのため申し訳ありませんが、この操作の名前を付ける方法はわかりません。ここに私が助けてくれることを願っている例があります。SQL - このような操作を行う方法?

私たちにはイベントが記録されるユーザーがいます。イベントは異なるタイプのものでもよい。ユーザーに対して発生したイベントがあるかどうかを示すレポート(新しいテーブル)を生成する必要があります。

Events    x EventInfo   = UserEvent  
---     ---      --- 
UserId | EventId  EventId | Type   UserId | login | verify 
------------------ -----------------  ------------------------   
1  | 1   1  | login   1  | True | True 
1  | 2   2  | verify  2  | False | False 
2  | 3   3  | login    

追加の制約:例えば

  • 私たちは、事前にイベントタイプを知らない(自分の名前または個別の種類の数でもない)
  • がデータベースに完全に起こる必要があり
+0

あなたがいないので、あらかじめ列として必要なイベントタイプの数や名前を知っていれば、動的SQLを使用してその詳細を発見し、@ sgeddesのような条件付き集計を使ってselect文を作成する必要があります。 – Matt

答えて

1

あなたがしようとしているのは、テーブルpivotの形式です。ここでconditional aggregationを使用して一つの選択肢です:

select e.userid, 
    max(case when ei.type = 'login' then 'True' else 'False' end) as login, 
    max(case when ei.type = 'verify' then 'True' else 'False' end) as verify 
from events e 
    join eventinfo ei on e.eventid = ei.eventid 
group by e.userid 

あなたはeventinfoテーブルに存在しない、あなたのeventテーブル内のレコードを持っている場合は、outer joinが必要な場合があります。


あなたがtypeがわからない場合、あなたはdynamic sqlを使用する必要があります、例の多くはそこにあります。

+0

これはおそらく単純な例では機能しますが、クエリの作成時にイベントの種類がわからない場合は失敗します。あなたのソリューションを一般化することは可能ですか? – Winks

+0

@ウィンクス - ちょうどあなたの編集や懸念に気づいた。 '動的なsql'を使用して'ピボット 'を作成する必要があります。その答えをbluefeetで見てください。完璧な例は 'case'ではなく' if'を使っていますが、同じように動作します。 – sgeddes

関連する問題