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.

CASE WHEN – Múltiples Condiciones – Sobre Múltiples Filas con la misma referencia

Estoy tratando de crear una bandera utilizando CASE WHEN para determinar algo, pero sigue devolviendo “single_state” – supongo que porque no está aplicando CASE WHEN a todas las filas con o/n 1234, que es la parte en la que necesito ayuda.

Mi resultado esperado es tener “multi_state” para las primeras 3 líneas, ya que todas tienen el mismo o/n, y “single_state” para la última línea porque no está agrupada ni tiene más de 1 estado.

Ejemplo a continuación:

Tabla DE DATOS

o/n      sku     order_type    state   state_check
1234    ABC987    Grouped     express
1234    BCD654    Grouped     arrived
1234    CDF321    Grouped     shipped
5679    GBT104   Not Grouped  express

Consulta

SELECT o/n, SKU, order_type, state, 
CASE WHEN order_type is "Grouped" AND (state = "express" AND state = "arrived") THEN "multi_state"
CASE WHEN order_type is "Grouped" AND (state = "express" AND state = "shipped") THEN "multi_state"
ELSE "single_state"
END AS state_check
FROM data_table
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la consulta actual es que la condición en la declaración CASE WHEN está comprobando si el estado es igual a dos valores diferentes al mismo tiempo (por ejemplo, estado = “express” Y estado = “arrived”). Esto nunca sería verdadero para ninguna fila, ya que un solo estado no puede tener dos valores diferentes al mismo tiempo.

    Para resolver esto, puedes cambiar la condición para usar OR en lugar de AND, y agrupar por la columna o/n para aplicar la declaración CASE WHEN a todas las filas con el mismo valor de o/n:

    SELECT o/n, SKU, order_type, state, 
    CASE WHEN order_type = "Grouped" AND o/n IN (
      SELECT o/n FROM data.table 
      WHERE order_type = "Grouped" 
      GROUP BY o/n 
      HAVING COUNT(DISTINCT state) > 1
    ) THEN "multi_state"
    ELSE "single_state"
    END AS state_check
    FROM data.table
    

    Esta consulta utiliza una subconsulta para obtener todos los valores únicos de o/n donde el order_type es “Grouped” y el número de estados distintos es mayor que 1. Esta subconsulta se utiliza luego como una condición en la declaración CASE WHEN de la consulta principal para determinar si cada fila debe ser clasificada como “multi_state” o “single_state”. El resultado debería ser la salida esperada dada en la pregunta.

Comments are closed.