Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Zeilen zu Spalten

Mit SQL ist das nicht möglich (außer bei dynamischen Abfragen), es sei denn, Sie kennen die Anzahl der Spalten (d. h. Fragen) in der Entwurfszeit.

Sie sollten die gewünschten Daten im Tabellenformat abrufen und dann auf der Clientseite verarbeiten:

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

oder wahrscheinlich dies (in SQL Server 2005+ , Oracle 8i+ und 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

Die letztere Abfrage liefert Ergebnisse in dieser Form (vorausgesetzt, Sie haben 4 Fragen):

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

, das heißt, es werden die Daten tabellarisch ausgegeben, mit rn Markierung der Zeilennummer.

Jedes Mal, wenn Sie den rn sehen auf dem Client ändern, schließen Sie einfach <tr> und öffnen Sie die neue.

Sie können Ihren <td> sicher hinterlegen ist eine pro Zeile der Ergebnismenge, da für jeden rn garantiert dieselbe Anzahl oder Zeilen zurückgegeben werden

Dies ist eine ziemlich häufig gestellte Frage.

SQL einfach nicht das richtige Werkzeug, um Daten mit einer dynamischen Anzahl von Spalten zurückzugeben.

SQL arbeitet mit Mengen, und das Spaltenlayout ist eine implizite Eigenschaft einer Menge.

Sie sollten das Layout des Satzes, den Sie erhalten möchten, zur Entwurfszeit definieren, genau wie Sie den Datentyp einer Variablen in C definieren .

C arbeitet mit streng definierten Variablen, SQL arbeitet mit streng definierten Mengen.

Beachten Sie, dass ich nicht sage, dass dies die bestmögliche Methode ist. Es ist einfach so SQL funktioniert.

Aktualisierung:

In SQL Server , können Sie die Tabelle in HTML ziehen Formular direkt aus der Datenbank:

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

Weitere Einzelheiten finden Sie in diesem Eintrag in meinem Blog:

  • Dynamischer Drehpunkt