2010-08-25 15 views
1

J'ai un tableau 1:Crosstab/requête Pivot dans TSQL sur les colonnes nvarchar

ID Property 
1 Name 
2 City 
3 Designation 

et Table2:

ID RecordID Table1ID Value 
1 1   1   David 
2 1   2   Tokyo 
3 2   1   Scott 
4 2   3   Manager 

Le Table1ID des cartes Table2 à l'ID de Table1. Maintenant, je veux montrer les valeurs de la colonne de propriété Tableau1 les en-têtes de colonnes et ont un jeu de résultats au format comme:

RecordID  Name City Designation 
1   David Tokyo NULL 
2   Scott NULL Manager 

Quel est le meilleur/moyen efficace pour y parvenir en T-SQL étant donné que le nombre d'enregistrements dans le tableau 1 (c'est-à-dire les colonnes du jeu de résultats) peuvent changer et doivent donc être traitées dynamiquement. Bien que j'aie essayé les requêtes basées sur PIVOT et CASE, mais j'ai eu des problèmes avec les deux. :(

Toute aide/conseils serait appréciée

Merci

Mise à jour:.!
Je suis en mesure de créer la requête dynamique, mais une chose que je ne suis toujours pas en mesure de comprendre est pourquoi MAX a été utilisé dans les instructions CASE Veuillez ignorer mon noobness

Répondre

3

utilisation:..

SELECT t2.recordid, 
     MAX(CASE WHEN t1.property = 'Name' THEN t2.value END) AS name, 
     MAX(CASE WHEN t1.property = 'City' THEN t2.value END) AS city, 
     MAX(CASE WHEN t1.property = 'Designation' THEN t2.value END) AS designation 
    FROM TABLE2 t2 
    JOIN TABLE1 t1 ON t1.id = t2.table1id 
GROUP BY t2.recordid 
ORDER BY t2.recordid 
+0

^^ Génial! juste deux questions: 1. Pourquoi avez-vous utilisé l'agrégat fn. MAX pour chaque CAS? 2. Comment gérer les instructions CASE dynamiquement lorsque le nombre d'entrées dans t1.Property peut changer? Merci beaucoup pour l'aide! – Dienekes

+0

+1 - pour ce genre de problème, c'est de préférence PIVOT dans mon esprit - je ne me souviendrai jamais de la syntaxe de PIVOT. :) –