Могу ли я превратить это в сводную таблицу? - PullRequest
1 голос
/ 03 декабря 2010

У меня следующий запрос:

select q.description question,
group_concat(a.description) answers
from answer a
join question q on a.question_id = q.id
where survey_id = 6
group by q.id

Это дает мне результат, который выглядит примерно так:

question             answers
Do you like cats?    Yes,Yes,No,Yes
Do you like pizza?   Yes,Yes,Yes,No

Есть ли способ, как я могу получить что-то более похожее на это?

question             answer1 answer2 answer3 answer4
Do you like cats?    Yes     Yes     No      Yes
Do you like pizza?   Yes     Yes     Yes     No

1 Ответ

0 голосов
/ 29 сентября 2011

Да, это возможно, но требуется динамический SQL;

Вы можете увидеть связанное решение, которое может быть расширено для вашей проблемы здесь: Сводки с динамическими столбцами в SQL Server 2005

Воспроизведено частично ниже, так как я думаю, что этоочень круто:


Этот запрос работает как в SQL Server 2000, так и в 2005 году. Он эффективен, но некоторым он может не понравиться, поскольку он использует одну и ту же переменную (@cols) с обеих сторон назначения.Другое решение, которое работает только на SQL Server 2005, - это использование XML PATH.
DECLARE @cols NVARCHAR(2000)
SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                '],[' + t2.ColName
                        FROM    Table1 AS t2
                        ORDER BY '],[' + t2.ColName
                        FOR XML PATH('')
                      ), 1, 2, '') + ']'

Этот список столбцов используется дважды в сводном запросе, который мы стремимся построить.Как только он используется в списке столбцов, которые мы хотим получить, и как только он используется в качестве списка значений, которые должны стать столбцами.Построив этот список столбцов выше, мы можем просто объединить его с отсутствующими частями сводного запроса, например:

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT tID, '+
@cols +'
FROM
(SELECT  t2.tID
      , t1.ColName
      , t2.Txt
FROM    Table1 AS t1
        JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p
PIVOT
(
MAX([Txt])
FOR ColName IN
( '+
@cols +' )
) AS pvt
ORDER BY tID;'

Выполнение этого с помощью

EXECUTE(@query)

даст нам ожидаемый результат: таблица, которая поворачивается и показывает столбцы, указанные в таблице:

tID         Country    Day        Month
----------- ---------- ---------- ----------
1           US         4          July
2           US         11         Sep
3           US         25         Dec
...