2011-08-09 13 views
8

Sto usando Microsoft SQL Server 2008.
Ho una tabella che sembra qualcosa di simile:Come trasporre un gruppo di risultati da SQL

|======================================================| 
| 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 | 
|------------------------------------------------------| 

Vorrei invertire le righe per essere colonne in modo che questo tavolo assomiglia a questo:

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

(i dati di esempio Ecco arbitrariamente costituiti, per cui il suo stupido)

La tabella di origine è una tabella temporanea con circa 70.000 righe.
Quale SQL dovrei scrivere per eseguire questa operazione?

Aggiornamento

  • io non so nemmeno se PIVOT è la strada giusta da percorrere.
  • Non so su quale colonna mettere PIVOT.
  • La documentazione menziona <aggregation function> e <column being aggregated> e non voglio aggregare nulla.

Grazie in anticipo.

+2

Hai esaminato 'PIVOT'? http://msdn.microsoft.com/en-us/library/ms177410.aspx –

+0

da quello che ho visto del comando 'PIVOT', devi usare una funzione di aggregazione. Non voglio una funzione aggregata, voglio solo che i valori vengano capovolti. – funkymushroom

risposta

7

È necessario utilizzare una funzione di aggregazione se si utilizza PIVOT. Tuttavia, dal momento che la vostra combinazione (RespondentId, QuestionId) è unico, i tuoi "gruppi" avrà una sola riga, in modo da poter utilizzare MIN() come una funzione di aggregazione:

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 

Se un gruppo contiene solo una riga, quindi MIN(value) = value, o in altri parole: la funzione aggregata diventa la funzione di identità.

+0

Grazie, questo ha funzionato perfettamente – funkymushroom

1

Vedere se this si inizia. Utilizzato per utilizzare le istruzioni CASE per farlo accadere, ma sembra che qualche accenno di PIVOT sia ora in SQL Server.

0

PIVOT è un inizio, ma la cosa con query SQL è che è davvero necessario sapere quali colonne aspettarsi nel set di risultati prima di scrivendo la query. Se non lo sai, l'ultima volta che ti ho controllato devi ricorrere a SQL dinamico o consentire all'app client che recupera i dati di eseguire il pivot.

+0

C'è un numero fisso di colonne (65 - una per ogni domanda di sondaggio), è solo che i loro nomi sono memorizzati come dati. – funkymushroom

+0

In questo caso, pivot dovrebbe fare ciò che ti serve, ma dovrai inserire una voce nell'elenco di selezione per ogni colonna –