2010-12-03 3 views
1

J'ai la requête suivante:Puis-je transformer cela en un tableau croisé dynamique?

select q.description question, 
group_concat(a.description) answers 
from answer a 
join question q on a.question_id = q.id 
where survey_id = 6 
group by q.id 

Il me donne un résultat qui ressemble à ceci:

question    answers 
Do you like cats? Yes,Yes,No,Yes 
Do you like pizza? Yes,Yes,Yes,No 

Est-il possible que je peux obtenir quelque chose comme ça?

question    answer1 answer2 answer3 answer4 
Do you like cats? Yes  Yes  No  Yes 
Do you like pizza? Yes  Yes  Yes  No 
+0

Probablement non. Y a-t-il un nombre fixe de réponses? –

+0

Quelle est la structure, etc. à partir de laquelle vous accédez à mysql? Cependant, je ne comprends pas le but de produire des données d'enquête brutes (non agrégées). Avez-vous seulement 4 participants? – Flinsch

+0

probablement pas ... à moins de casser chaque réponse en utilisant la sous-requête – ajreal

Répondre

0

Oui, cela est possible, mais nécessite SQL dynamique;

Vous pouvez voir une solution connexe qui peut être étendue à votre problème: Pivots with Dynamic Columns in SQL Server 2005

Reproduit en partie ci-dessous, car je pense qu'il est très cool:


Cette requête fonctionne à la fois sur SQL Server 2000 et 2005 Il est efficace, mais certains peuvent ne pas l'aimer car il utilise la même variable (@cols) des deux côtés d'une affectation. Une autre solution qui fonctionne uniquement sur SQL Server 2005 consiste à utiliser XML PATH.

DECLARE @cols NVARCHAR(2000) 
SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t2.ColName 
         FROM Table1 AS t2 
         ORDER BY '],[' + t2.ColName 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

Cette liste de colonnes est utilisée deux fois dans la requête pivot que nous cherchons à construire. Une fois qu'il est utilisé dans la liste des colonnes que nous voulons récupérer, et une fois qu'il est utilisé comme la liste des valeurs qui devraient devenir des colonnes. Après avoir construit cette liste de colonnes ci-dessus, nous pouvons juste concaténer avec les parties manquantes de la requête de pivot comme:

DECLARE @query NVARCHAR(4000) 
SET @query = N'SELECT tID, '+ 
@cols +' 
FROM 
(SELECT t2.tID 
     , t1.ColName 
     , t2.Txt 
FROM Table1 AS t1 
     JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p 
PIVOT 
(
MAX([Txt]) 
FOR ColName IN 
('+ 
@cols +') 
) AS pvt 
ORDER BY tID;' 

L'exécution de cette avec

EXECUTE(@query) 

nous donnera le résultat attendu: une table est pivoté et affiche les colonnes qui ont été spécifiées dans un tableau:

tID   Country Day  Month 
----------- ---------- ---------- ---------- 
1   US   4   July 
2   US   11   Sep 
3   US   25   Dec 
Questions connexes