es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta SQL para pivote múltiple en la misma columna SELECT [Columna], [Valor1] AS [Pivote1], [Valor2] AS [Pivote2], [Valor3] AS [Pivote3] FROM [Tabla] PIVOT ( MAX([Valor]) FOR [Otra Columna] IN ([Valor1], [Valor2], [Valor3]) ) AS PivotTable;

Como requisito, necesito aplicar el pivote dos veces en la misma columna para obtener diferentes valores como encabezado de columna. A continuación, puede ver cómo se presenta los datos en la tabla y los resultados esperados.

Tabla

Pregunta Respuesta Respuesta Traducida ID de actividad creado el
Razón Testing testaus 1 01-01-2022
Email abc@gmail.com abc@gmail.com 1 01-01-2022
Acción test testata 1 01-01-2022

Resultado deseado :

Email Razón Acción Acción traducida Razón traducida ID de actividad creado el
abc@gmail.com Testing test testata testaus 1 01-01-2022

He logrado esto utilizando la siguiente consulta donde funciona mediante la combinación interna con dos declaraciones de selección de pivotes diferentes.

¿Hay otra forma de escribir una consulta SQL para optimizarla y eliminar la combinación interna?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No es posible eliminar el uso de un inner join en esta consulta, ya que estás uniendo dos tablas pivotadas basadas en las columnas comunes ‘activityid’ y ‘createdon’. Sin embargo, puedes optimizar la consulta utilizando Expresiones de Tabla Comunes (CTEs) en lugar de subconsultas, lo cual puede hacer que el código sea más legible y más fácil de mantener.

    Aquí tienes un ejemplo de cómo podrías escribir la consulta utilizando CTEs:

    WITH Pivot1 AS (
        SELECT activityid, createdon, [Email], [Reason], [Action]
        FROM Table
        PIVOT (MAX(response) FOR question IN ([Email], [Reason], [Action])) pv1
    ),
    Pivot2 AS (
        SELECT activityid, createdon, [Translated Action], [Translated Reason]
        FROM Table
        PIVOT (MAX(translatedresponse) FOR question IN ([Email], [Action], [Reason])) pv2
    )
    SELECT p1.[Email], p1.[Reason], p1.[Action], p2.[Translated Action], p2.[Translated Reason], p1.activityid, p1.createdon
    FROM Pivot1 p1
    JOIN Pivot2 p2 ON p1.activityid = p2.activityid AND p1.createdon = p2.createdon;
    

    Esta consulta logra el mismo resultado que la consulta original, pero utiliza CTEs para mejorar la legibilidad del código y facilitar la comprensión de las diferentes partes de la consulta. El uso de CTEs también puede ayudar a optimizar el rendimiento de la consulta al descomponerla en partes más pequeñas y manejables que se pueden ejecutar de manera más eficiente.

Comments are closed.