2010-05-25 4 views
0

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

Например, рассмотрим данные происходит некорректно

SELECT 11826 ID,cast('64 ' as varchar(1000)) as answer,75098 QuestionID,2785 CollectionID into #temp 
insert into #temp SELECT 11827 ID,cast('Security ' as varchar(1000)) as answer,75110 QuestionID,2785 CollectionID 
insert into #temp SELECT 11828 ID,cast('42 ' as varchar(1000)) as answer,75115 QuestionID,2785 CollectionID 
insert into #temp SELECT 11829 ID,cast('3/23/2010 12:01:00 AM ' as varchar(1000)) as answer,75119 QuestionID,2785 CollectionID 
insert into #temp SELECT 11830 ID,cast('3/25/2010 ' as varchar(1000)) as answer,75120 QuestionID,2785 CollectionID 
insert into #temp SELECT 11898 ID,cast('67 ' as varchar(1000)) as answer,75313 QuestionID,2792 CollectionID 
insert into #temp SELECT 11899 ID,cast('True ' as varchar(1000)) as answer,75314 QuestionID,2792 CollectionID 
insert into #temp SELECT 11900 ID,cast('0 ' as varchar(1000)) as answer,75315 QuestionID,2792 CollectionID 
insert into #temp SELECT 11901 ID,cast('adlfkj[email protected] ' as varchar(1000)) as answer,75316 QuestionID,2792 CollectionID 

Результаты должны дать что-то вроде

CollectionID [AnswerFor75098]  [AnswerFor75110]  [AnswerFor75115]  [AnswerFor75315]... 
2785    64     Security   42     
2792    Null    Null     Null     67 

Я экспериментировал с PIVOT, однако я не уверен, что это правильное решение. Если да, есть ли у кого-нибудь подсказка, которую я мог бы использовать? Я думаю, что, возможно, я могу сделать это в хранимой процедуре, однако, я стараюсь избегать использования курсоров, если это возможно.

Спасибо за помощь

ответ

1

Что вы ищете, это запрос кросс-таблицы. Если вы знаете номера вопроса, которые вы ищете раньше времени, вы можете сделать это так:

Select CollectionId 
    , Min(Case When Question = 75098 Then Answer End) As AnswerFor75098 
    , Min(Case When Question = 75110 Then Answer End) As AnswerFor75110 
    , Min(Case When Question = 75115 Then Answer End) As AnswerFor75115 
    , Min(Case When Question = 75315 Then Answer End) As AnswerFor75315 
From #Temp 
Group By CollectionId 

Однако, если то, что вы хотите, чтобы динамически определить столбцы, основанные на вопросы, то, что вы хотите динамический перекрестный и это невозможно сделать в SQL Server без какого-либо динамичного динамического SQL. Вместо этого вы должны сделать это в среднем уровне или в инструменте отчетности.

+0

Там я иду, чрезмерное. Сначала я попытаюсь использовать этот подход, тогда я буду возиться со стержнем. – Beta033

1

Одна вещь, что люди часто не понимают, когда они пытаются PIVOT в том, что вы должны знать ваши столбцы и жесткий код их в запросе. Это заставляет нас думать: «Это действительно лучший способ?»

Вы не можете написать SQL-запрос общего назначения, который динамически добавляет столбцы на основе значений данных, даже если вы используете синтаксис Microsoft PIVOT.

PIVOT все еще немного удобнее, чем писать кучу JOIN, поэтому я предлагаю перейти с PIVOT (если вы используете исключительно Microsoft SQL Server).

+0

Oracle 11g + поддерживает Стержнем и синтаксис UNPIVOT. В моем ограниченном сравнении PIVOT и CASE на SQL Server 2005 CASE была немного быстрее. Я склонен использовать заявления CASE, в первую очередь, для соображений переносимости. –

+0

Это невозможно сделать строго в одном запросе SELECT, но вы можете сделать это с сохраненным проком, имеющим один выбор, чтобы построить динамический SQL, который он выполняет динамически. Как это случилось, я сделал это сегодня утром, используя идеи, украденные с http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server- 2005-2008.aspx –

0

Я сделал быстрый Sql, чтобы показать, как использовать Pivot с вашими данными образца. Я думаю, что его можно улучшить, чтобы добиться того, чего вы хотите.

Select CollectionId,[75098],[75110],[75113],[75114],[75115] from 
(Select QuestionID ,CollectionId, answer From #temp group by QuestionID,CollectionId, answer) as ST 
    PIVOT (count(QuestionID) for QuestionID in ([75098],[75110],[75113],[75114],[75115]))as PT 
group by CollectionId,[75098],[75110],[75113],[75114],[75115] 

@community, пожалуйста, не стесняйтесь предложить какие-либо поправки к этому предложению

Смежные вопросы