Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wiersze SQL do kolumn

Nie możesz tego zrobić za pomocą SQL (z wyjątkiem zapytań dynamicznych), chyba że znasz liczbę kolumn (tj. pytań) w czasie projektowania.

Powinieneś pobrać żądane dane w formacie tabelarycznym, a następnie przetworzyć je po stronie klienta:

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

lub prawdopodobnie to (w SQL Server 2005+ , Oracle 8i+ i 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

Drugie zapytanie da wyniki w tym formularzu (pod warunkiem, że masz 4 pytania):

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 będzie wyprowadzać dane w formie tabelarycznej, z rn zaznaczając numer wiersza.

Za każdym razem, gdy zobaczysz rn zmieniając na kliencie, po prostu zamykasz <tr> i otwórz nowy.

Możesz bezpiecznie umieścić swój <td> 's jeden na wiersz zestawu wyników, ponieważ ta sama liczba lub wiersze zostaną zwrócone dla każdego rn

To dość często zadawane pytanie.

SQL po prostu nie jest to właściwe narzędzie do zwracania danych z dynamiczną liczbą kolumn.

SQL działa na zestawach, a układ kolumn jest niejawną właściwością zestawu.

Powinieneś zdefiniować układ zestawu, który chcesz uzyskać w czasie projektowania, tak jak definiujesz typ danych zmiennej w C .

C działa ze ściśle określonymi zmiennymi, SQL działa ze ściśle określonymi zestawami.

Zauważ, że nie mówię, że jest to najlepsza możliwa metoda. To po prostu sposób SQL działa.

Aktualizacja:

W SQL Server , możesz ściągnąć tabelę w HTML formularz bezpośrednio z bazy danych:

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

Zobacz ten wpis na moim blogu, aby uzyskać więcej informacji:

  • Dynamiczny obrót


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używana wersja SQL Server nie obsługuje danych typu datetime2?

  2. Wykonaj procedurę składowaną w innej procedurze składowanej na serwerze SQL

  3. Usuń zdarzenia z dziennika poczty bazy danych w programie SQL Server (T-SQL)

  4. Jak wybrać wszystkie rekordy z jednej tabeli, które nie istnieją w innej tabeli?

  5. Jaka jest korzyść z używania SET XACT_ABORT ON w procedurze składowanej?