2011-08-09 12 views
8

estoy usando Microsoft SQL Server 2008.
Tengo una tabla que se ve algo como esto:la forma de transferir un conjunto de resultados de 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 | 
|------------------------------------------------------| 

me gustaría pasar las filas para ser columnas para que este tabla es el siguiente:

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

(los datos del ejemplo aquí se hace arbitrariamente, por lo que su tonta)

La tabla fuente es una tabla temporal con aproximadamente 70,000 filas.
¿Qué SQL necesitaría escribir para hacer esto?

actualización

  • Ni siquiera sé si el pivote es la forma correcta de proceder.
  • No sé en qué columna pegar PIVOT.
  • La documentación menciona <aggregation function> y <column being aggregated> y no quiero agregar nada.

Gracias de antemano.

+2

¿Has mirado en 'PIVOT'? http://msdn.microsoft.com/en-us/library/ms177410.aspx –

+0

según lo que he visto del comando 'PIVOT', debe usar una función agregada. No quiero una función agregada, solo quiero que se den vuelta los valores. – funkymushroom

Respuesta

7

Es necesario utilizar una función de agregado si usa PIVOT. Sin embargo, ya que su combinación (RespondentId, QuestionId) es único, sus "grupos" tendrán sólo una fila, por lo que puede utilizar MIN() como una función agregada:

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 

Si un grupo sólo contienen una fila, a continuación, MIN(value) = value, o en otra palabras: la función agregada se convierte en la función de identidad.

+0

Gracias, esto funcionó perfectamente – funkymushroom

1

Verifique si this comienza. Solía ​​tener que usar sentencias CASE para que eso ocurriera, pero parece que ahora se tiene una idea de PIVOT en SQL Server.

0

PIVOT es un comienzo, pero la cosa con las consultas SQL es que realmente necesita saber qué columnas esperar en el conjunto de resultados antes de escribir la consulta. Si no sabe esto, la última vez que lo verifiqué debe recurrir a sql dinámico o permitir que la aplicación del cliente que recupera los datos haga el pivote en su lugar.

+0

Hay un número fijo de columnas (65, una para cada pregunta de encuesta), es solo que sus nombres se almacenan como datos. – funkymushroom

+0

En ese caso, el pivote debe hacer lo que necesita, pero deberá ingresar una entrada en su lista de selección para cada columna –

Cuestiones relacionadas