Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL редове към колони

Не можете да го направите с SQL (освен при динамични заявки), освен ако не знаете броя на колоните (т.е. въпроси) по време на проектиране.

Трябва да изтеглите данните, които искате, в табличен формат и след това да ги обработите от страна на клиента:

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

или вероятно това (в SQL Server 2005+ , Oracle 8i+ и 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

Последната заявка ще ви даде резултати в този формуляр (при условие че имате 4 въпроси):

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

, това ще изведе данните в табличен вид, с rn маркиране на номера на реда.

Всеки път, когато видите rn промяна на клиента, просто затваряте <tr> и отворете новия.

Можете спокойно да поставите своя <td> 's по един на ред от набор от резултати, тъй като същият номер или редове гарантирано ще бъдат върнати за всеки rn

Това е доста често задаван въпрос.

SQL просто не е подходящ инструмент за връщане на данни с динамичен брой колони.

SQL работи с набори, а оформлението на колоните е имплицитно свойство на набор.

Трябва да дефинирате оформлението на набора, който искате да получите по време на проектиране, точно както дефинирате типа данни на променлива в C .

C работи със строго дефинирани променливи, SQL работи със строго определени набори.

Имайте предвид, че не казвам, че това е най-добрият възможен метод. Това е просто начинът SQL работи.

Актуализация:

В SQL Server , можете да изтеглите таблицата в HTML формуляр направо от базата данни:

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

Вижте този запис в моя блог за повече подробности:

  • Динамично завъртане


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заобиколно решение за DATEDIFF() игнориране на SET DATEFIRST в SQL Server (пример за T-SQL)

  2. SQL Server Log Shipping &Disaster Recovery Installation and Configuration -3

  3. Подреждане Чрез използване на параметър за името на колоната

  4. Съхранение на XML данни в SQL Server

  5. Как да намерите таблици, които съдържат конкретна колона в SQL Server