2011-08-09 4 views
8

Я использую Microsoft SQL Server 2008.
У меня есть таблица, которая выглядит примерно так:Как транспонировать из SQL ResultSet

|======================================================| 
| RespondentId | QuestionId | AnswerValue | ColumnName | 
|======================================================| 
|  P123  |  1  |  Y  | CanBathe | 
|------------------------------------------------------| 
|  P123  |  2  |  3  | TimesADay | 
|------------------------------------------------------| 
|  P123  |  3  |  1.00 | SoapPrice | 
|------------------------------------------------------| 
|  P465  |  1  |  Y  | CanBathe | 
|------------------------------------------------------| 
|  P465  |  2  |  1  | TimesADay | 
|------------------------------------------------------| 
|  P465  |  3  |  0.99 | SoapPrice | 
|------------------------------------------------------| 
|  P901  |  1  |  N  | CanBathe | 
|------------------------------------------------------| 
|  P901  |  2  |  0  | TimesADay | 
|------------------------------------------------------| 
|  P901  |  3  |  0.00 | SoapPrice | 
|------------------------------------------------------| 

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

|=================================================| 
| RespondentId | CanBathe | TimesADay | SoapPrice | 
|=================================================| 
|  P123  |  Y |  3 | 1.00 | 
|-------------------------------------------------| 
|  P465  |  Y |  1 | 0.99 | 
|-------------------------------------------------| 
|  P901  |  N |  0 | 0.00 | 
|-------------------------------------------------| 

(примерные данные здесь произвольно накрашенные, так что его глупо)

Исходная таблица представляет собой временную таблицу с примерно 70 000 строк.
Какой SQL мне нужно написать, чтобы сделать это?

Update

  • Я даже не знаю, если PIVOT правильный путь.
  • Я не знаю, в какой колонке PIVOT.
  • В документации упоминаются <aggregation function> и <column being aggregated>, и я не хочу ничего агрегировать.

Заранее спасибо.

+2

Вы изучали 'PIVOT'? http://msdn.microsoft.com/en-us/library/ms177410.aspx –

+0

Из того, что я видел в команде 'PIVOT', вы должны использовать функцию агрегата. Мне не нужна сводная функция, я просто хочу, чтобы значения были перевернуты. – funkymushroom

ответ

7

Он должен использовать агрегатную функцию, если вы используете PIVOT. Однако, так как ваша (RespondentId, QuestionId) комбинация является уникальной, ваши «группы» будет иметь только один ряд, так что вы можете использовать MIN() в качестве агрегатной функции:

SELECT RespondentId, CanBathe, TimesADay, SoapPrice 
FROM (SELECT RespondentId, ColumnName, AnswerValue FROM MyTable) AS src 
PIVOT (MIN(AnswerValue) FOR ColumnName IN(CanBathe, TimesADay, SoapPrice)) AS pvt 

Если группа содержит только одну строку, а затем MIN(value) = value, или в других слова: совокупная функция становится функцией тождества.

+0

Спасибо, это сработало отлично – funkymushroom

1

Посмотрите, подходит ли вам this. Используется для использования операторов CASE, чтобы это произошло, но похоже, что некоторые подозрения PIVOT сейчас находятся в SQL Server.

0

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

+0

Существует фиксированное количество столбцов (65 - по одному для каждого вопроса опроса), а именно, что их имена хранятся в виде данных. – funkymushroom

+0

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

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