Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Lignes SQL en colonnes

Vous ne pouvez pas le faire avec SQL (sauf avec les requêtes dynamiques), sauf si vous connaissez le nombre de colonnes (c'est-à-dire les questions) au moment du design.

Vous devez extraire les données souhaitées sous forme de tableau, puis les traiter côté client :

SELECT  *
FROM    Question
LEFT OUTER JOIN
        Response
ON      Response.QuestionId = Question.QuestionID

ou, probablement, ceci (dans SQL Server 2005+ , Oracle 8i+ et PostgreSQL 8.4+ ):

SELECT  *
FROM    (
        SELECT  q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
        FROM    Question q
        ) q
LEFT OUTER JOIN
        (
        SELECT  r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
        FROM    Response r
        ) r
ON      r.QuestionId = q.QuestionID
        AND q.rn = r.rn
ORDER BY
        q.rn, q.QuestionID

Cette dernière requête vous donnera des résultats sous cette forme (à condition que vous ayez 4 questions):

rn      question      response
---          ---           ---
1     Question 1  Response 1.1
1     Question 2  Response 2.1
1     Question 3  Response 3.1
1     Question 4  Response 4.1
2     Question 1  Response 1.2
2     Question 2  Response 2.2
2     Question 3  NULL
2     Question 4  Response 4.2
3     Question 1  NULL
3     Question 2  NULL
3     Question 3  Response 3.3
3     Question 4  NULL

, c'est-à-dire qu'il affichera les données sous forme de tableau, avec rn marquer le numéro de ligne.

Chaque fois que vous voyez le rn changeant sur le client, vous fermez simplement <tr> et ouvrez le nouveau.

Vous pouvez mettre votre <td> en toute sécurité est un par ligne de jeu de résultats, car le même nombre de lignes est garanti d'être renvoyé pour chaque rn

C'est une question assez fréquemment posée.

SQL tout simplement pas un bon outil pour renvoyer des données avec un nombre dynamique de colonnes.

SQL fonctionne sur des ensembles et la disposition des colonnes est une propriété implicite d'un ensemble.

Vous devez définir la disposition de l'ensemble que vous souhaitez obtenir au moment du design, tout comme vous définissez le type de données d'une variable en C .

C fonctionne avec des variables strictement définies, SQL fonctionne avec des ensembles strictement définis.

Notez que je ne dis pas que c'est la meilleure méthode possible. C'est juste la façon dont SQL fonctionne.

Mise à jour :

Dans SQL Server , vous pouvez extraire le tableau en HTML formulaire directement sorti de la base de données :

WITH    a AS
        (
        SELECT  a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
        FROM    answer a
        ),
        rows AS (
        SELECT  ROW_NUMBER() OVER (ORDER BY id) AS rn
        FROM    answer a
        WHERE   question_id =
                (
                SELECT  TOP 1 question_id
                FROM    answer a
                GROUP BY
                        question_id
                ORDER BY
                        COUNT(*) DESC
                )
        )
SELECT  (
        SELECT  COALESCE(a.value, '')
        FROM   question q
        LEFT JOIN
                a
        ON      a.rn = rows.rn
                AND a.question_id = q.id
        FOR XML PATH ('td'), TYPE
        ) AS tr
FROM    rows
FOR XML PATH(''), ROOT('table')

Voir cette entrée dans mon blog pour plus de détails :

  • Pivot dynamique