2016-08-30 7 views
0

Ich habe zwei Tabellen:einfügen Spalten in Zeilen für jede ID

Tabelle 1:

ID  name 
--------- ----------- 
    1   john 
    2   salma 
    3   tony 

table2:

ID   Tasks  amount 
--------- ----------- ---------- 
    1   write   2 
    1   memorize  3 
    1   read   6 
    1   sing   NULL 
    2   write   1 
    2   memorize  NULL 
    2   read   5 
    2   sing   NULL 
    3   write  NULL 
    3   memorize  8 
    3   read   2 
    3   sing   NULL 

ich für jede Aufgabe, neue Spalten in Tabelle 1 eingefügt werden soll erwähnt in Tabelle2.

Tabelle 1:

ID  name  write memorize read sing 
--------- ----------- -------- --------- ------- -------- 
    1   john  2   3   6  NULL 
    2   salma  1   NULL  5  NULL 
    3   tony  NULL  8   2  NULL 

ich den Einsatz in Tabelle 1 ID zu einem Zeitpunkt für eine tun kann, aber nicht für alle. Danke im Voraus!

+0

Wenn es eine endliche und bekannte Anzahl von möglichen Werten gibt, die den hinzuzufügenden Spalten entsprechen, was hindert Sie daran, sie explizit als einmalige Operation hinzuzufügen? Wenn es * nicht * ist, empfehle ich * * dies * sehr * zu tun. Dynamische Schemas sind relationale Datenbanken sind eine bekannte schlechte Idee. – David

+0

@David dies ist nur ein Beispiel für eine viel größere Tabelle, so dass es explizit keine Option ist. Danke für den Ratschlag! – Wafae

+0

Warum nicht? Über wie viele Spalten reden wir hier? Wenn es * Hunderte * von Spalten gibt, dann ist dies möglicherweise nicht der beste Weg an erster Stelle. Selbst wenn sie explizit definiert werden, müssen sie nicht unbedingt von Hand eingegeben werden. Sie können 'SELECT DISTINCT' auf den Daten auswählen, um die Spaltennamen zu erhalten und diese Liste in einen beliebigen Texteditor zu übernehmen, um die Spaltennamen schnell in vordefinierte 'ALTER TABLE'-Snippets einzufügen, um die Spalten hinzuzufügen. – David

Antwort

1

Zuerst habe ich die Zeilenwerte in einer temporären Tabelle als Spalten unter Verwendung pivot eingefügt:

select * into #Results 
     from 
     (
      select ID,Tasks,amount 
      from #Table2 

     ) tb2 
    pivot 
    (
     max(amount) 
     for ID in ([1], [2], [3]) 
    ) as piv 

Dann habe ich eine inner join mit Tabelle1:

select * from Table1 tb1 inner join #Results r on r.ID =tb1.ID 

Dank @JamesL für die seggustion zu Verwenden Sie pivot!

Verwandte Themen