Diviser plusieurs colonnes en plusieurs lignes
J'ai une table avec cette structure.
UserID | UserName | AnswerToQuestion1 | AnswerToQuestion2 | AnswerToQuestion3
1 | John | 1 | 0 | 1
2 | Mary | 1 | 1 | 0
Je ne peux pas comprendre ce que la requête SQL, je voudrais utiliser pour obtenir un résultat comme ceci:
UserID | UserName | QuestionName | Response
1 | John | AnswerToQuestion1 | 1
1 | John | AnswerToQuestion2 | 0
1 | John | AnswerToQuestion3 | 1
2 | Mary | AnswerToQuestion1 | 1
2 | Mary | AnswerToQuestion2 | 1
2 | Mary | AnswerToQuestion3 | 0
Je suis en train de séparer les trois colonnes en trois lignes séparées. Est-ce possible?
source d'informationauteur Sandro
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne aussi bien pour UNPIVOT (parfois mieux) et travaille dans SQL 2000.
J'ai profité de l'questions similitude pour créer le QuestionName colonne, mais bien sûr cela va fonctionner avec divers question des noms.
Noter que si la liste des questions est longue ou la question des noms sont longs, vous pouvez tester avec 2 colonnes dans le X de la table, l'un pour le numéro de la question et un pour la question du nom. Ou si vous avez déjà un tableau avec la liste de questions, puis de JOINTURE CROISÉE. Si certaines questions sont NULLES alors le plus simple est de mettre la requête ci-dessus dans un CTE ou dérivée, tableau, puis ajouter
WHERE Response IS NOT NULL
.Selon Itzik Ben-Gan en À l'intérieur de Microsoft SQL Server 2008: T-SQL d'InterrogationSQL Server passe par trois étapes quand unpivoting une table:
Etape 1: Générer des copies
Une table virtuelle est créée, qui a une copie de chaque ligne dans la table originale pour chaque colonne est unpivoted.
Aussi, une chaîne de caractères du nom de la colonne est stockée dans une nouvelle colonne (appelons cela la QuestionName colonne). *Note: j'ai modifié la valeur dans l'une de vos colonnes NULL pour montrer le processus complet.
Étape 2: Extraire les éléments
Puis une autre table est créée, ce qui crée une nouvelle ligne pour chaque valeur de la colonne source qui correspond
le caractère de la chaîne de valeur dans le QuestionName colonne. La valeur est stockée dans une nouvelle colonne (appelons cela la Réponse de la colonne).
Étape 3: Supprimer les lignes avec des valeurs NULL
Cette étape de filtrer les lignes qui ont été créés avec des valeurs null dans la colonne de Réponse. En d'autres termes,
si l'un des AnswerToQuestion colonnes avaient une valeur null, il ne serait pas être représenté comme une unpivoted ligne.
Si vous suivez ces étapes, vous pouvez
nom de la colonne pour obtenir la ligne des copies
sur la correspondance de la colonne de la source et QuestionName
résultats sans l'aide de UNPIVOT.
Un exemple ci-dessous:
En supposant que SQL Server 2005+ vous pouvez utiliser UNPIVOT