sql >> Databasteknik >  >> RDS >> Sqlserver

SQL rader till kolumner

Du kan inte göra det med SQL (förutom med dynamiska frågor), såvida du inte vet antalet kolumner (dvs. frågor) i designtid.

Du bör hämta den information du vill ha i tabellformat och sedan bearbeta den på klientsidan:

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

eller, förmodligen, detta (i SQL Server 2005+ , Oracle 8i+ och 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

Den senare frågan ger dig resultat i det här formuläret (förutsatt att du har 4 frågor):

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

, detta kommer att mata ut data i tabellform, med rn markerar radnumret.

Varje gång du ser rn ändras på klienten stänger du bara <tr> och öppna den nya.

Du kan säkert lägga din <td> s en per resultatuppsättningsrad, eftersom samma antal eller rader garanteras returneras för varje rn

Detta är en ganska ofta ställd fråga.

SQL bara inte ett rätt verktyg för att returnera data med dynamiskt antal kolumner.

SQL fungerar på uppsättningar, och kolumnlayouten är en implicit egenskap hos en uppsättning.

Du bör definiera layouten för den uppsättning du vill få i designtid, precis som du definierar datatypen för en variabel i C .

C fungerar med strikt definierade variabler, SQL fungerar med strikt definierade uppsättningar.

Observera att jag inte säger att det är den bästa möjliga metoden. Det är precis så SQL fungerar.

Uppdatering:

I SQL Server , kan du dra tabellen i HTML formulär direkt från databasen:

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

Se det här inlägget i min blogg för mer information:

  • Dynamisk pivot


  1. MySQL-satsen tar mer än minut att exekvera

  2. Hur man får aktuellt datum och tid i MySQL

  3. PHP, ORM, MSSQL och Unicode, är det möjligt att få dessa att fungera tillsammans?

  4. SQLite kan inte öppna databasfil (kod 14) vid frekvent SELECT-fråga