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

SQL rækker til kolonner

Du kan ikke gøre det med SQL (undtagen med dynamiske forespørgsler), medmindre du kender antallet af kolonner (dvs. spørgsmål) i designtid.

Du skal trække de ønskede data i tabelformat og derefter behandle dem på klientsiden:

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

eller sandsynligvis dette (i SQL Server 2005+ , Oracle 8i+ og 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

Sidstnævnte forespørgsel vil give dig resultater i denne formular (forudsat at du har 4). spørgsmål):

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

, dette er, at den udsender dataene i tabelform med rn markering af rækkenummeret.

Hver gang du ser rn ændres på klienten, lukker du bare og åbn den nye.

Du kan roligt indsætte din 's én pr. resultatsætrække, da samme antal eller rækker med garanti returneres for hver rn

Dette er et ret ofte stillet spørgsmål.

SQL bare ikke et rigtigt værktøj til at returnere data med dynamisk antal kolonner.

SQL fungerer på sæt, og kolonnelayoutet er en implicit egenskab for et sæt.

Du bør definere layoutet for det sæt, du ønsker at få i designtid, ligesom du definerer datatypen for en variabel i C .

C arbejder med strengt definerede variable, SQL fungerer med strengt definerede sæt.

Bemærk, at jeg ikke siger, at det er den bedst mulige metode. Det er bare sådan SQL virker.

Opdatering:

I SQL-server , kan du trække tabellen i HTML formular lige ud af 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 dette indlæg i min blog for flere detaljer:

  • Dynamisk pivot


  1. hvordan udfører man Stored Procedure i SQL Developer?

  2. Oracle RAC og sekvenser

  3. Bedste DBaaS-løsning til MySQL

  4. SQL OR Operator for begyndere