2 votes

Somme des éléments ne répondant pas à la clause SQL "HAVING"

J'ai une table de production avec les colonnes code, name, country, production

J'ai besoin de lister les pays dont la production dépasse les 1000 et aussi de faire une somme de la production de tous les autres pays et de la qualifier d'autre. Ainsi, la sortie ressemblera à ceci

Pays     production
-------   ----------
Japon     1380
Angleterre 1400
Autre     2700

Est-il possible de réaliser ceci sans utiliser de union dans une seule requête?

4voto

niktrs Points 4013

En utilisant une sous-requête :

SELECT CASE WHEN production >= 1000 THEN country ELSE 'Other' END country
     , SUM(production) AS production
FROM(
    SELECT country, 
           SUM(production) AS production
    FROM production
    GROUP BY country
) AS a
GROUP BY CASE WHEN production >= 1000 THEN country ELSE 'Other' END

1voto

Filip De Vos Points 6012

Étant donné que vous souhaitez retourner toutes les données, mais regroupées différemment, vous n'avez pas besoin de considérer cette tâche comme un exercice de "Filtrage", mais seulement comme un exercice de regroupement/re-étiquetage. Pour ré-étiqueter tout ce qui dépasse une production de 1000, vous pouvez utiliser l'instruction CASE. Tout ce qu'il reste à faire est le regroupement. Pas besoin de sous-requêtes.

  SELECT country = CASE WHEN production >= 1000 
                        THEN country 
                        ELSE 'Autre' 
                   END 
       , production = SUM(production)
    FROM production
GROUP BY CASE WHEN production >= 1000 
              THEN country 
              ELSE 'Autre' 
         END

Si la table peut contenir plusieurs enregistrements par pays, la réponse de @niktrs est correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X