Comment adhérer à des valeurs de ligne pour les noms de colonne dans une requête dynamique
Je développe une application qui permet configurable de questions et de réponses. Actuellement, il peut y avoir jusqu'à 20 réponses, mais peut-être moins.
La structure que j'ai est comme suit:
Questions
+----+--------+--------------+-------------+
| ID | FormId | QuestionText | AnswerField |
+----+--------+--------------+-------------+
| 1 | 1 | Name | Answer01 |
| 2 | 1 | Address | Answer02 |
| 3 | 1 | Phone | Answer03 |
| 4 | 1 | Email | Answer04 |
| 5 | 2 | First Name | Answer01 |
| 6 | 2 | Surname | Answer02 |
+----+--------+--------------+-------------+
Réponses
+----+--------+----------+------------+--------------+--------------+----------------+----------+----------+
| ID | FormId | RecordId | Answer01 | Answer02 | Answer03 | Answer04 | Answer05 | Answer06 |
+----+--------+----------+------------+--------------+--------------+----------------+----------+----------+
| 1 | 1 | 1 | Bob Smith | Bobs Address | 01234 111222 | bob@smith.com | Null | Null |
| 2 | 1 | 2 | Joe Bloggs | Joes Address | 04321 333444 | joe@bloggs.com | Null | Null |
| 3 | 2 | 3 | David | Jones | Null | Null | Null | |
+----+--------+----------+------------+--------------+--------------+----------------+----------+----------+
Donc dans les Questions de la table AnswerField Answer01 cartes à la Answer01 colonne dans les Réponses de la table
Ce que je voudrais faire est d'obtenir un résultat qui ressemble à quelque chose comme:
Pour l'ID du formulaire 1 & ID de l'enregistrement 1:
+--------------+---------------+
| QuestionText | Answer |
+--------------+---------------+
| Name | Bob Smith |
| Address | Bobs Address |
| Phone | 01234 111222 |
| Email | bob@smith.com |
+--------------+---------------+
Puis pour l'id du formulaire 2 & id de l'enregistrement 3:
+--------------+---------+
| QuestionText | Answer |
+--------------+---------+
| First Name | David |
| Surname | Jones |
+--------------+---------+
J'ai essayé d'utiliser un tableau croisé dynamique:
SELECT QuestionText, Answer01, Answer02, Answer03, Answer04
FROM (
SELECT DISTINCT Q.AnswerField, Q.QuestionText, Q.ID, A.Answer01, A.Answer02, A.Answer03, A.Answer04
FROM Questions Q
INNER JOIN Answers A ON A.FormId= Q.FormId
WHERE A.ID = 17
)
AS src
PIVOT (MAX(question_id) FOR Answer IN(answer_01, answer_02, answer_03, answer_04)) AS pvt
Mais il répète les réponses à toutes les colonnes:
+--------------+-----------+--------------+--------------+---------------+
| QuestionText | Answer01 | Answer02 | Answer03 | Answer04 |
+--------------+-----------+--------------+--------------+---------------+
| Name | Bob smith | Bobs Address | 01234 111222 | bob@smith.com |
| Address | Bob smith | Bobs Address | 01234 111222 | bob@smith.com |
| Phone | Bob smith | Bobs Address | 01234 111222 | bob@smith.com |
| Email | Bob smith | Bobs Address | 01234 111222 | bob@smith.com |
+--------------+-----------+--------------+--------------+---------------+
Qui n'est évidemment pas la droite.
Quelqu'un peut-il suggérer comment cela pourrait être fait dans une procédure stockée SQL Server s'il vous plaît?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vos
Answers
table est terriblement conçu. Cette table n'est pas normalisée qui va vous causer des problèmes lorsque vous souhaitez renvoyer des données. Si possible, vous avez besoin de restructurer la table.Si vous ne pouvez pas la refonte de la table, alors vous aurez à unpivot les réponses de la table pour être en mesure de rejoindre facilement les réponses aux questions.
Un UNPIVOT permettra de prendre vos colonnes et de les convertir en lignes. Le unpivot code sera:
Voir SQL jouer avec la Démo. Cela donne un résultat:
Une fois que les données sont en lignes, alors vous pouvez rejoindre les questions de la table de retourner le résultat que vous souhaitez:
Voir SQL jouer avec la Démo. Cela donne un résultat: