Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Righe SQL a colonne

Non puoi farlo con SQL (tranne per le query dinamiche), a meno che tu non conosca il numero di colonne (ad es. domande) in fase di progettazione.

Dovresti estrarre i dati che desideri in formato tabulare e quindi elaborarli sul lato client:

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

o, probabilmente, questo (in SQL Server 2005+ , Oracle 8i+ e 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

Quest'ultima query ti darà risultati in questo modulo (a condizione che tu abbia 4 domande):

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

, questo produrrà i dati in forma tabellare, con rn segnando il numero di riga.

Ogni volta che vedi il rn cambiando sul client, chiudi semplicemente <tr> e apri quello nuovo.

Puoi tranquillamente inserire il tuo <td> è uno per riga del set di risultati, poiché è garantito che vengano restituiti lo stesso numero o le stesse righe per ogni rn

Questa è una domanda abbastanza frequente.

SQL semplicemente non è uno strumento giusto per restituire dati con numero dinamico di colonne.

SQL opera sugli insiemi e il layout delle colonne è una proprietà implicita di un insieme.

Dovresti definire il layout del set che vuoi ottenere in fase di progettazione, proprio come definisci il tipo di dati di una variabile in C .

C funziona con variabili rigorosamente definite, SQL funziona con insiemi rigorosamente definiti.

Nota che non sto dicendo che sia il miglior metodo possibile. È solo il modo in cui SQL funziona.

Aggiornamento:

In SQL Server , puoi estrarre la tabella in HTML modulo direttamente dal database:

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')

Vedi questa voce nel mio blog per maggiori dettagli:

  • Perno dinamico