PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 22/03/2022 17:15:14

Ligne manquante?

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

#2 22/03/2022 17:55:35

gleu
Administrateur

Re : Ligne manquante?

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

#3 22/03/2022 18:03:23

Re : Ligne manquante?

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

#4 22/03/2022 21:24:30

dverite
Membre

Re : Ligne manquante?

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)

Hors ligne

#5 23/03/2022 10:17:13

Re : Ligne manquante?

ça marche! un tout grand merci!

Hors ligne

Pied de page des forums