IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

case et count(*)


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut case et count(*)
    Bonjour, je me remet doucement dans le SQL et je ne comprend pas pourquoi cette requête ne fonctionne pas.

    Requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select (case when origine_typeopcom='PCN' or origine_typeopcom='MAJ' then ORIGINE_LIBOPCOM else 'MANUEL' end) as Motif,
    DATE_MAJ_CAISSE
    from CAISSE.CHGT_PRIX
    where date_MAJ_CAISSE >='2018-09-19' and date_MAJ_CAISSE <='2018-11-15'
    Mais j'ai plusieurs fois le même Motif, à la même Date_Maj_caisse, je souhaite donc utiliser count(*) pour les regrouper et avoir un tableau plus lisible. C'est là que je bloque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select (case when origine_typeopcom='PCN' or origine_typeopcom='MAJ' then ORIGINE_LIBOPCOM else 'MANUEL' end) as Motif,
    DATE_MAJ_CAISSE, count(*)
    from CAISSE.CHGT_PRIX
    where date_MAJ_CAISSE >='2018-09-19' and date_MAJ_CAISSE <='2018-11-15'
    group by DATE_MAJ_CAISSE,(case when origine_typeopcom='PCN' or origine_typeopcom='MAJ' then ORIGINE_LIBOPCOM else 'MANUEL' end) as Motif
    ça me renvoi :
    Error: ILLEGAL SYMBOL as; VALID SYMBOLS ARE M else 'MANUEL' end). .. (State:37000, Native Code: FFFFFF98)
    Error: An error occurred during implicit system action type '2'. Information returned for the error includes SQLCODE '-104', SQLSTATE '42601' and message tokens 'as|M else 'MANUEL' end)|..'. (State:56098, Native Code: FFFFFD29)

    Merci d'avance.

    ImuraDarling

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Commençons par simplifier et écrire plus lisiblement votre première requête en l'incrémentant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	CASE 
    		WHEN origine_typeopcom IN('PCN', 'MAJ') THEN origine_typeopcom 
    		ELSE 'MANUEL' 
    	END as Motif,
    	DATE_MAJ_CAISSE
    FROM CAISSE.CHGT_PRIX
    WHERE date_MAJ_CAISSE BETWEEN '2018-09-19' and '2018-11-15'
    =>
    1) IN à la place du OR
    2) Parenthèses inutiles
    3) BETWEEN à la place de >= AND <=

    Mais j'ai plusieurs fois le même Motif, à la même Date_Maj_caisse, je souhaite donc utiliser count(*) pour les regrouper et avoir un tableau plus lisible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    	CASE 
    		WHEN origine_typeopcom IN('PCN', 'MAJ') THEN origine_typeopcom 
    		ELSE 'MANUEL' 
    	END AS Motif,
    	date_maj_caisse,
    	COUNT(*) AS Nombre
    FROM caisse.chgt_prix
    WHERE date_maj_caisse BETWEEN '2018-09-19' and '2018-11-15'
    GROUP BY date_maj_caisse, Motif
    =>
    4) Réutilisation de l'alias Motif dans le GROUP BY à la place du CASE.
    Si vous réécrivez le CASE dans le GROUP BY, ne mettez pas l'alias ! L'alias ne sert qu'à nommer des colonnes dans le SELECT pour faciliter l'affichage ou pour réutiliser plusieurs fois dans une requête les mêmes éléments (notamment les tables dans les requêtes avec jointures).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Effectivement, l'utilisation du "IN" et du "BETWEEN" rend la requête plus lisible. Je vais penser à les utiliser plus souvent dans mes requêtes.

    Au début, j'avais bien réutilisé l'alias dans le groupe by, mais ça ne fonctionnait pas, c'est pour ça que j'ai réutilisé le case. Là, je viens de réessayer, ça ne fonctionne toujours pas avec l'alias, mais en réutilisant le case oui. (sans l'alias, du coup).

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. case avec count
    Par cuteness10 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/09/2016, 11h26
  2. Requete select CASE WHEN COUNT
    Par dadateite dans le forum Langage SQL
    Réponses: 11
    Dernier message: 03/04/2014, 11h01
  3. [SQL2005] COUNT(CASE THEN (COUNT DISTINCT)) ?
    Par apnw7931 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2013, 15h08
  4. Case et count(distinct())
    Par stos dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/03/2013, 16h28
  5. CASE WHEN + COUNT
    Par nicerico dans le forum MySQL
    Réponses: 5
    Dernier message: 24/03/2009, 06h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo