2010-10-29 5 views
3

Je me suis gratté la tête sur ce sujet, mais j'ai l'impression d'ignorer la réponse évidente, et aucune de mes expressions de recherche n'a donné de résultats. Je compile les résultats d'un sondage dans une base de données, dans la structure suivante.Création de plusieurs groupes de données dans SQLServer

ID TestName  Q1 Q2 Q3 Q4 
-- --------- ---- ---- ---- ---- 
1 test1  1  2  1  1 
2 test1  2  3  4  1 
3 test2  1  1  4  2 
4 test1  2  5  3  4 
5 test2  1  5  2  4 

Je veux regrouper les résultats similaires dans chaque colonne, que si elles ont elles partagent le même nom, et obtenir un compte de chaque résultat similaire. Ma sortie finale est montrée ci-dessous, mais j'essaie de savoir comment écrire la requête sans avoir 4 requêtes séparées.

Test 1 
     Question 1 Results 
     1(1) 
     2(2) 
     3(0) 
     4(0) 
     5(0) 

     Question 2 Results 
     1(0) 
     2(1) 
     3(1) 
     4(0) 
     5(1) 

     Question 3 Results 
     1(1) 
     2(0) 
     3(1) 
     4(1) 
     5(0) 

     Question 4 Results 
     1(2) 
     2(0) 
     3(0) 
     4(1) 
     5(0) 

Test 2 
     Question 1 Results 
     1(2) 
     2(0) 
     3(0) 
     4(0) 
     5(0) 

     Question 2 Results 
     1(1) 
     2(0) 
     3(0) 
     4(0) 
     5(1) 

     Question 3 Results 
     1(0) 
     2(1) 
     3(0) 
     4(1) 
     5(0) 

     Question 4 Results 
     1(0) 
     2(1) 
     3(0) 
     4(1) 
     5(0) 
+2

Le résultat attendu ne semble pas correspondre à l'exemple de données –

+0

J'ai essayé de le rendre plus clair? Faites-moi savoir si cela n'a toujours pas de sens. J'ai des problèmes parce que je finis par le mettre en graphique à barres. – Patcouch22

Répondre

1
declare @YourTable table (
    id int, 
    TestName varchar(10), 
    q1 char(1), 
    q2 char(1), 
    q3 char(1), 
    q4 char(1) 
) 

insert into @YourTable 
    (id, TestName, q1, q2, q3, q4) 
    select 1,'test1','1','2','1','1' union all 
    select 2,'test1','2','3','4','1' union all 
    select 3,'test2','1','1','4','2' union all 
    select 4,'test1','2','5','3','4' union all 
    select 5,'test2','1','5','2','4' 

select TestName, 
     sum(case when q1 = '1' then 1 else 0 end) as [q1(1)], 
     sum(case when q1 = '2' then 1 else 0 end) as [q1(2)], 
     /* ... */ 
     sum(case when q4 = '4' then 1 else 0 end) as [q4(4)],  
     sum(case when q4 = '5' then 1 else 0 end) as [q4(5)] 
    from @YourTable 
    group by TestName 
+0

Obtention de l'erreur suivante: Erreur yntax (opérateur manquant) dans l'expression de requête 'sum (cas où Question1 =' 1 'puis 1 sinon 0 fin)'. – Patcouch22

+0

@ Patcouch22: Je ne sais pas pourquoi vous auriez cette erreur. J'ai édité ma réponse pour inclure une table de test pour illustrer que la technique fonctionne. Vous devriez pouvoir couper/coller ce code et le lancer vous-même. J'espère que cela vous aidera à réduire l'erreur de votre côté. –

+0

Erreur de syntaxe de ma part. Merci pour le code! – Patcouch22

1

quelque chose comme

select name, sum(q1), sum(q2), sum(q3), sum(q4) 
from tbl 
group by name 

si vous stockez les valeurs q comme varchar, vous pouvez les convertir en numérique avant de les résumer:

sum(cast(q1 as int)) 
+0

Cela ne compte que le nombre total de lignes et ne se regroupe pas par des réponses similaires. – Patcouch22

+0

les résultats ne correspondent pas à votre production? l'astuce consiste à grouper par votre champ de nom de test – Beth

+0

Non, il finit par afficher le nombre total de chaque TestName pris pour chaque question. – Patcouch22

Questions connexes