2009-09-24 7 views
0

J'ai la table de base de données suivante:requête SQL pour afficher les données db

Réponse

MemberID | QuestionNo | AnswerNo | AnswerString 
10  | 1   |  2  | q1 anwer2 
10  | 2.1   |  3  | q2.1 answer3 
10  | 2.2   |  5  | q2.2 answer5 
10  | 7   |  1  | q7 answer 7 
11  | 1   |  3  | q1 anwer 3 
11  | 3   |  1  | q3 answer 1 
11  | 5   |  4  | q5 anwer 4 

Chaque membre répond ensemble différent de questions basées sur les réponses des questions précédentes. Je veux montrer la réponse dans le format suivant

MemberID | 1 | 2.1 | 2.2 | 3 | 5 | 7 
10  | 2 | 3 | 5 |NULL |NULL| 1 
11  | 3 |NULL |NULL | 1 | 4 |NULL 

Puis-je le faire que dans SQL Server 2005? Ou dois-je utiliser ASP.net pour le traiter?

Répondre

3

Vous cherchez à faire pivoter des données - changer les données de colonne en lignes. L'ancienne méthode consiste à utiliser les instructions CASE - à partir de SQL Server 2005, vous pouvez utiliser la commande PIVOT. Je vais laisser à quelqu'un d'autre le soin de fournir l'exemple PIVOT. Il n'est pas clair pour moi quel est le type de données de la colonne questionno, mettre à jour pour adapter si nécessaire.

Si les utilisateurs peuvent définir leurs propres questions, vous devez utiliser SQL dynamique. Vous devez d'abord obtenir une liste de questions, puis construire les instructions CASE en fonction de ces résultats. De même pour PIVOT ...

DECLARE @SQL nvarchar(4000) 
DECLARE @questionno [data type here] 

SET @SQL = 'SELECT t.memberid,' 

DECLARE c1 CURSOR READ_ONLY FOR 
    SELECT t.questionno 
    FROM ANSWER t 
GROUP BY t.questionno 
ORDER BY t.questionno 

OPEN c1 

FETCH NEXT FROM c1 INTO @questionno 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @SQL = @SQL + ' CASE WHEN t.questionno = '+ @questionno +' THEN t.answerno ELSE NULL END AS '+ @questionno',' 

    FETCH NEXT FROM c1 INTO @questionno 
END 

CLOSE c1 
DEALLOCATE c1 

SET @SQL = @SQL + 'NULL FROM ANSWER t ' 

EXEC(@SQL) 

Le NULL FROM ... est parce que je suis trop paresseux pour se débarrasser de la virgule qui viendrait de la dernière instruction CASE.

+0

Je ne pense pas que PIVOT sera en mesure de rendre les colonnes dynamiques mieux que l'instruction case. Une option consiste à générer un SQL dynamique, puis à l'exécuter. – tster

+0

Que faire si l'utilisateur peut ajouter des questions par lui-même? Je ne peux pas coder en dur le questionno dans le sql. – Billy

+0

J'aime l'idée d'utiliser NULL pour surmonter la virgule supplémentaire - une meilleure solution que de raccourcir la chaîne. * Fichiers à l'arrière du cerveau pour référence future * – Billious

0

Je pense que la réponse est non, parce que vous essayez d'exécuter les valeurs de la colonne QuestionNo à travers votre affichage. Donc je ne pense pas que vous serez capable de créer une requête SQL pour représenter les données de cette façon. Cela dit, tout programme client pour représenter les données de cette façon devrait être trivial car vous ne faites que transposer des données. Vous n'avez pas nécessairement besoin d'un programme .NET. Un script simple devrait suffire.

(Pensez-y un peu plus, si vous vouliez utiliser T-SQL avec son contrôle de flux supplémentaire, ses opérations de chaînes de caractères, ses curseurs, etc., vous pourriez probablement le faire. un programme client.)

EDIT: N'avait jamais rencontré PIVOT auparavant (voir autres réponses). On dirait que cela aidera, mais nécessite un peu de travail.

0

Vous devez utiliser une requête pivot. Microsoft a des exemples here et il y en a beaucoup plus sur Google.

+0

Que faire si l'utilisateur peut ajouter des questions par lui-même? Je ne peux pas coder en dur le questionno dans le sql. PIVOT ( SUM (AnswerNo) POUR QuestionNo IN ([Je ne peux pas coder en dur ce]) ) p – Billy

+0

Pour MS SQL il faut eval'd SQL. L'exemple sur http://www.kodyaz.com/articles/t-sql-pivot-tables-in-sql-server-tutorial-with-examples.aspx (dans la section "Dynamic Pivot Queries Requêtes en SQL") est aussi simple et raisonnable que possible. – hobbs

Questions connexes