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.

¿Cómo deshago la pivoteación de un resultado de consulta con Sum Case When que involucra uniones internas de varias tablas?

Tengo la misión de consultar varias tablas y sumar sus valores basándome en las opciones seleccionadas por el usuario y la forma en la que encontré para hacerlo vino de aquí usando sum case when then y else.
Ahora mi dilema es que puedo obtener los resultados, pero solo están estructurados en columnas, pero me encantaría que estuvieran estructurados en filas, así que descubrí pivot y unpivot, pero desafortunadamente no puedo obtener mis resultados en filas.

Aquí está mi consulta:

select
SUM(CASE WHEN opcao = ‘ABC’ THEN 1 ELSE 0 END) as ABC,
SUM(CASE WHEN opcao = ‘DEF’ THEN 1 ELSE 0 END) as DEF,
SUM(CASE WHEN opcao = ‘GHI’ THEN 1 ELSE 0 END) as GHI,
SUM(CASE WHEN opcao = ‘JKL’ THEN 1 ELSE 0 END) as JKL,
SUM(CASE WHEN opcao = ‘MNO’ THEN 1 ELSE 0 END) as MNO,

from
paciente_paciente pp
inner join coleta_preenchimento cp on cp.paciente_id = pp.paciente_id
inner join coleta_preenchimento_pergunta cpp on cpp.preenchimento_id = cp.preenchimento_id
inner join coleta_pergunta_opcao cpo on cpo.opcao_id = cpp.opcao_id
inner join coleta_atendimento_formulario caf on caf.preenchimento_id = cp.preenchimento_id
inner join coleta_atendimento ca on ca.atendimento_id = caf.atendimento_id
where
ca.status = ‘FINALIZADO’
and cpp.pergunta_id= 1076

Resultado que estoy obteniendo:

ABC DEF GHI JKL MNO
0 1 1 0 1

Resultado esperado:

OPTION VALUE
ABC 0
DEF 1
GHI 1
JKL 0
MNO 1

¡Gracias de antemano por toda la ayuda!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado esperado, se puede utilizar la función unpivot para transformar las columnas en filas. Aquí hay un ejemplo de cómo puede modificar su consulta para obtener la salida deseada:

    SELECT option AS OPCION, value AS VALOR
    FROM (
      SELECT
        SUM(CASE WHEN opcao = 'ABC' THEN 1 ELSE 0 END) as ABC,
        SUM(CASE WHEN opcao = 'DEF' THEN 1 ELSE 0 END) as DEF,
        SUM(CASE WHEN opcao = 'GHI' THEN 1 ELSE 0 END) as GHI,
        SUM(CASE WHEN opcao = 'JKL' THEN 1 ELSE 0 END) as JKL,
        SUM(CASE WHEN opcao = 'MNO' THEN 1 ELSE 0 END) as MNO
      FROM
        paciente_paciente pp
        INNER JOIN coleta_preenchimento cp ON cp.paciente_id = pp.paciente_id
        INNER JOIN coleta_preenchimento_pergunta cpp ON cpp.preenchimento_id = cp.preenchimento_id
        INNER JOIN coleta_pergunta_opcao cpo ON cpo.opcao_id = cpp.opcao_id
        INNER JOIN coleta_atendimento_formulario caf ON caf.preenchimento_id = cp.preenchimento_id
        INNER JOIN coleta_atendimento ca ON ca.atendimento_id = caf.atendimento_id
      WHERE
        ca.status = 'FINALIZADO'
        AND cpp.pergunta_id = 1076
    ) AS p
    UNPIVOT (value FOR option IN (ABC, DEF, GHI, JKL, MNO)) AS unpvt;
    

    En esta consulta modificada, se utiliza la función unpivot para transformar las columnas ABC, DEF, GHI, JKL y MNO en filas con los valores correspondientes. La salida de esta consulta estará en el formato esperado, con las opciones en una columna y los valores respectivos en otra.

    ¡Espero que esto ayude! Hágamelo saber si tiene más preguntas.

Comments are closed.