Guide for GroupBy 9: Subconsultes i CASE


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.

Com abordar aquest problema

Practiques dues eines: les subconsultes (un SELECT dins d'un altre, que pot consultar fins i tot una taula diferent) i l'expressió CASE, que permet calcular una columna nova amb un valor o un altre segons una condició.

La sintaxi que necessites

Subconsulta escalar i subconsulta amb IN:

SELECT columnes FROM taula_1
WHERE valor > (SELECT AVG(valor) FROM taula_2);
SELECT columnes FROM taula_1
WHERE columna IN (SELECT columna FROM taula_1 WHERE condicio);

Expressió CASE:

SELECT columna,
       CASE WHEN condicio THEN 'Text A'
            ELSE 'Text B'
       END
FROM taula;
  • La subconsulta pot llegir una taula diferent de la de la consulta exterior.
  • Amb IN, la subconsulta retorna una llista d'una sola columna i la fila es queda si el seu valor hi apareix.
  • CASE avalua les condicions WHEN per ordre, es queda amb la primera que es compleix i, si no se'n compleix cap, fa servir l'ELSE. És una columna més del resultat.

Pregunta per pregunta

Pregunta 1. Atenció a les taules: les files que mostres són d'una taula, però la mitjana es calcula sobre una altra. La subconsulta ha de llegir la taula correcta. Dues columnes.

Pregunta 2. No cal filtrar cap fila: cada empleat surt una vegada, amb el cognom i una columna calculada amb CASE. Mira bé si el límit està inclòs ("o més" vol dir >=) i que els textos siguin exactament els de l'enunciat, amb majúscules.

Pregunta 3. Pensa en dos passos: primer, quins noms de pila tenen els empleats que cobren aquell import exacte (això és la subconsulta, que retorna una llista); després, quins empleats tenen un nom que és en aquesta llista. Tot sobre la mateixa taula.

Un exemple semblant

Empleats de Employees que cobren menys que el sou màxim de Employees3:

SELECT FirstName, Salary
FROM Employees
WHERE Salary < (SELECT MAX(Salary) FROM Employees3);

Classificació en tres trams dels empleats de Employees:

SELECT FirstName,
       CASE WHEN Salary < 1200 THEN 'Tram 1'
            WHEN Salary < 1600 THEN 'Tram 2'
            ELSE 'Tram 3'
       END
FROM Employees;

Empleats de Employees amb un cognom que també surt a Employees3:

SELECT FirstName, LastName
FROM Employees
WHERE LastName IN (SELECT LastName FROM Employees3);

Paranys habituals:

  • Fer la subconsulta sobre la mateixa taula que l'exterior quan l'enunciat en demana una altra (o al revés).
  • Oblidar l'END del CASE, o confondre > amb >= en el límit.
  • Fer servir = amb una subconsulta que pot retornar més d'un valor: SQLite agafa només el primer sense avisar. Si són diversos valors, cal IN.
  • El jutge no mira els noms de les columnes ni l'ordre de les files, però sí el nombre de columnes i el seu ordre: no afegeixis columnes "de regal" (com l'identificador) si no te les demanen.

Tornar al problema