Necesito tu ayuda para escribir una consulta difícil. El escenario es como abajo

Table

La ubicación con los atributos A, I, Z debe excluirse (lo cual es simple). Pero hay una excepción. Cuando la ubicación contiene una combinación de atributos A e I, no debe excluirse (es decir, Bangalore no debe excluirse). Mientras que Delhi (con los atributos A y Q estaría excluido). Por lo tanto, el resultado de la consulta debería ser el siguiente.

Output

La consulta para la exclusión es simple como a continuación

SELECT LOCATION
FROM TABLE
WHERE ATTRIBUTE NOT IN ('A','I','Z')

Pero debe extenderse para considerar la excepción para los atributos A e I.

1
kavana Kav 14 sep. 2018 a las 11:22

3 respuestas

La mejor respuesta

Un enfoque es agrupar según la ubicación y contar el número de atributos diferentes. Al usar una declaración de caso, podría coincidir solo con los atributos relevantes:

SELECT   location
FROM     mytable
GROUP BY location
HAVING   COUNT(DISTINCT CASE WHEN attribute IN ('A', 'I') THEN 1 END) = 2 OR
         COUNT(DISTINCT CASE WHEN attribute IN ('A', 'I', 'Z') THEN 1 END) = 0
1
Mureinik 14 sep. 2018 a las 08:31

Aquí hay una tercera opción:

    SELECT t.LOCATION
    FROM TABLE t
    WHERE t.ATTRIBUTE NOT IN ( 'A','I','Z' )
       OR ( t.ATTRIBUTE = 'A'
        AND EXISTS( SELECT 1
                    FROM TABLE t2
                    WHERE t.LOCATION   = t2.LOCATION
                      AND t2.ATTRIBUTE = 'I' ) )
0
Set 14 sep. 2018 a las 08:46

La siguiente consulta mostrará las ubicaciones, que no están en A, I, Z, excluyendo Bangalore.

SELECT Location
FROM 
TABLE WHERE 
LOCATION NOT IN 
(SELECT LOCATION, 
FROM TABLE
WHERE ATTRIBUTE IN ('A','I','Z')
UNION ALL
SELECT LOCATION
FROM TABLE
WHERE ATTRIBUTE IN ('A','Q')
GROUP BY LOCATION
HAVING COUNT(DISTINCT ATTRIBUTE) = 2)
UNION ALL
SELECT LOCATION
FROM TABLE
WHERE ATTRIBUTE IN ('A','I')
GROUP BY LOCATION
HAVING COUNT(DISTINCT ATTRIBUTE) = 2
1
Venkataraman R 14 sep. 2018 a las 09:30