2016-08-07 12 views
0

Entschuldigung für den uninformativen Titel, ich weiß nicht, wie ich diese Operation benennen soll. Hier ist ein Beispiel, von dem ich hoffe, dass es hilft.SQL - Wie funktioniert diese Join-ähnliche Operation?

Wir haben Benutzer, für die wir Ereignisse protokollieren. Ereignisse können unterschiedlicher Art sein. Wir möchten einen Bericht (eine neue Tabelle) erzeugen, der sagt, wenn ein Ereignis für einen Benutzer aufgetreten ist; zum Beispiel:

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    

Zusätzliche Einschränkungen:

  • Wir wissen nicht, die Ereignistypen vorher (weder ihren Namen oder die Anzahl der verschiedenen Arten)
  • vollständig in der Datenbank geschehen hat
+0

, weil Sie nicht tun Wenn Sie die Anzahl oder Namen von Ereignistypen kennen, die Sie als Spalten haben möchten, müssen Sie dynamic sql verwenden, um diese Details zu ermitteln und eine Auswahlanweisung zu erstellen, die bedingte Aggregation wie die Antwort von @sgeddes verwendet. – Matt

Antwort

1

Was Sie versuchen, ist eine Form einer Tabelle pivot. Hier ist eine Option 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 

Sie können ein outer join benötigen, wenn Sie Datensätze in Ihrer event Tabelle, die in der eventinfo Tabelle nicht existieren.


Wenn Sie nicht wissen, die type, werden Sie dynamic sql verwenden müssen, gibt es viele Beispiele gibt:

+0

Dies funktioniert wahrscheinlich für das einfache Beispiel, schlägt aber fehl, wenn wir die Ereignistypen zum Zeitpunkt des Schreibens der Abfrage nicht kennen. Ist es möglich, Ihre Lösung zu verallgemeinern? – Winks

+0

@Winks - gerade Ihre Änderungen und Bedenken bemerkt. Sie müssen 'dynamic sql' verwenden, um den' pivot' zu erstellen. Sehen Sie sich diese Antwort von bluefeet an, ein perfektes Beispiel, das 'if' anstelle von' case' verwendet, aber genauso funktioniert. – sgeddes

Verwandte Themen