Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'utilise le programme pgAdmin4, postgreSQL 12 pour apprendre à utiliser SQL, en parallèle avec une série de vidéos.
J'aimerais obtenir un tableau de 2 colonnes, avec:
1) la première colonne qui contient 4 catégories de durée de films: "Less than 1 hour", "1 and 2 hours", "2 and 3 hours", "Over 3 hours"
2) la deuxième colonne qui contient le nombre de films pour chacune des catégories de durée.
J'insère la requête suivante pour obtenir le résultat désiré - la même que le formateur dans les vidéos. Lui obtient le résultat souhaité, mais pas moi:
select case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'over 3 hours'
end as FilmLengthCategory
, count (film_id) as CountofFilms
from film
group by case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'Over 3 hours'
end
order by CountOfFilms desc
Pourriez-vous svp m'aider?
Hors ligne
Le seul problème que je vois est le 'over 3 hours' et 'Over 3 hours' (le o minuscule puis O majuscule). Si ce n'est pas ça, il va falloir donner un exemple complet.
Guillaume.
Hors ligne
J'ai essayé; pas de changement.
Malheureusement je ne sais pas ajouter de capture d'écran en pièce jointe...
Le message que j'ai est le suivant:
"la colonne « film.length » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat"
Dernière modification par Franck_NsunguLukanda (22/03/2022 18:04:36)
Hors ligne
Vous avez sans doute fait une erreur de manip. C'est facile à tester, créer une table vide avec juste les 2 colonnes requêtées
CREATE TABLE film(film_id int, length int);
Lancer la requête copié-collée. Effectivement elle sort l'erreur mentionnée.
select case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'over 3 hours'
end as FilmLengthCategory
, count (film_id) as CountofFilms
from film
group by case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'Over 3 hours'
end
order by CountOfFilms desc
ERREUR: la colonne « film.length » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
LIGNE 2 : when length between 0 and 59 then 'Less then 1 hour'
Changer le 'over' en 'Over', relancer, résultat: plus d'erreur:
select case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'Over 3 hours'
end as FilmLengthCategory
, count (film_id) as CountofFilms
from film
group by case
when length between 0 and 59 then 'Less then 1 hour'
when length between 60 and 119 then '1 to 2 hours'
when length between 120 and 179 then '2 to 3 hours'
else 'Over 3 hours'
end
order by CountOfFilms desc
filmlengthcategory | countoffilms
--------------------+--------------
(0 ligne)
PS: on peut aussi écrire GROUP BY 1 avec PostgreSQL pour grouper par la première colonne sans répéter toute l'expression mais c'est non-standard.
Dernière modification par dverite (22/03/2022 21:26:34)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
ça marche! un tout grand merci!
Hors ligne
Pages : 1