sql >> Databáze >  >> RDS >> Sqlserver

SQL řádky do sloupců

Nemůžete to udělat pomocí SQL (s výjimkou dynamických dotazů), pokud neznáte počet sloupců (tj. otázek) v době návrhu.

Měli byste stáhnout požadovaná data v tabulkovém formátu a poté je zpracovat na straně klienta:

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

nebo pravděpodobně toto (v SQL Server 2005+ , Oracle 8i+ a 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

Poslední dotaz vám poskytne výsledky v tomto formuláři (za předpokladu, že máte 4 otázky):

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

, to je to, že vypíše data v tabulkové formě s rn označení čísla řádku.

Pokaždé, když uvidíte rn Při změně na klientovi stačí zavřete <tr> a otevřete nový.

Můžete bezpečně vložit svůj <td> jeden na řádek sady výsledků, protože pro každý rn je zaručeno vrácení stejného počtu nebo řádků

Toto je poměrně často kladená otázka.

SQL prostě to není správný nástroj pro vrácení dat s dynamickým počtem sloupců.

SQL funguje na množinách a rozložení sloupců je implicitní vlastností množiny.

Měli byste definovat rozložení sady, kterou chcete získat v době návrhu, stejně jako definujete datový typ proměnné v C .

C pracuje s přesně definovanými proměnnými, SQL pracuje s přesně definovanými sadami.

Všimněte si, že neříkám, že je to nejlepší možná metoda. Je to prostě způsob SQL funguje.

Aktualizace:

V SQL Server , můžete tabulku stáhnout v HTML formulář přímo z databáze:

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

Další podrobnosti naleznete v tomto příspěvku na mém blogu:

  • Dynamický pivot


  1. TRUNC(datum) Funkce v Oracle

  2. Získejte počet záznamů ovlivněných INSERT nebo UPDATE v PostgreSQL

  3. dynamický dotaz mysql v uložené proceduře

  4. Aritmetika sloupce data v dotazu PostgreSQL