Хорошо. Итак, я видел ваш ответ, и у меня есть предложение для вас. Вы действительно правы, когда говорите, что собираетесь сделать это с помощью оси.
Итак, сначала я упростил ваши данные для целей тестирования. Данные теста выглядят так:
CREATE TABLE Table1
(
Lastname VARCHAR(100),
Firstname VARCHAR(100),
Answer VARCHAR(100),
Question VARCHAR(100),
Correct BIT
)
INSERT INTO Table1
VALUES
('Somename','Somefirstname','Some answer','Some question text?',0),
('Somename','Somefirstname','Answer to second question','Second question in same column?',1),
('Othername','Otherfirstname','Some answer','Some question text?',0),
('Othername','Otherfirstname','Wrong answer to second question','Second question in same column?',0),
('Fifth','Fifthname','Other answer','Some question text?',1),
('Fifth','Fifthname','Wrong answer to second question','Second question in same column?',0)
Вам нужно получить уникальные столбцы для поворота. Как это:
DECLARE @Questions VARCHAR(MAX)
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY Question ORDER BY Question) AS RowNbr,
ROW_NUMBER() OVER(ORDER BY Question) AS OrderBy,
Table1.Question
FROM
Table1
), CTE2
AS
(
SELECT
CTE.OrderBy AS OrderBy,
1 AS SecondOrder,
CTE.Question
FROM
CTE
WHERE
CTE.RowNbr=1
UNION ALL
SELECT
CTE.OrderBy AS OrderBy,
2 AS SecondOrder,
'Is '+CTE.Question
FROM
CTE
WHERE
CTE.RowNbr=1
)
SELECT
@Questions = COALESCE(@Questions + ','+QUOTENAME(Question),
QUOTENAME(Question))
FROM
CTE2
ORDER BY
CTE2.OrderBy,
CTE2.SecondOrder
Первый ROW_NUMBER() OVER(PARTITION BY Question ORDER BY Question)
- получить уникальные столбцы. Я буду использовать его позже с оператором where
.
Второй ROW_NUMBER() OVER(ORDER BY Question)
это заказать вопросы
* * * * * * * * * * * * * * * * * * * * SecondOrder
, так что вы закажете вопрос перед тем, как задать вопрос "Есть".
* * * * * * * * * * * * * * * * * * * *
1030 *.
@Questions = COALESCE(@Questions + ','+QUOTENAME(Question),
.. Сводит столбцы в один varchar
Затем нам нужно создать динамический sql для pivot и в конце выполнить его. Как это:
DECLARE @query NVARCHAR(4000)=
N';WITH CTE
AS
(
SELECT
Table1.Lastname,
Table1.Firstname,
Table1.Answer,
Table1.Question
FROM
Table1
UNION ALL
SELECT
Table1.Lastname,
Table1.Firstname,
CAST(Table1.Correct AS VARCHAR(10)) AS Answer,
''Is ''+Table1.Question AS Question
FROM
Table1
)
SELECT
*
FROM
(
SELECT
CTE.Lastname,
CTE.Firstname,
CTE.Answer,
CTE.Question
FROM
CTE
) AS p
PIVOT
(
MAX(Answer)
FOR Question IN ('+@Questions+')
) AS pvt'
EXECUTE(@query)
Тогда нам нужно UNION ALL
вопросы с вопросами «Есть»
Столбец Correct
приведен к VARCHAR
, поскольку UNION ALL
и сводная диаграмма не допускают разные типы данных
Мы будем использовать MAX
агрегат, чтобы получить ответ, который нам нужен. Это связано с тем, что сводная таблица требует использования агрегата.
FOR Question IN ('+@Questions+')
- это столбцы, которые мы констатировали в приведенном выше запросе.
Вы можете увидеть результат и данные примера здесь
Надеюсь, это поможет вам