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

Requêtes MySQL Discussion :

Aide avec Case et Having [MySQL-5.5]


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut Aide avec Case et Having
    Salut à tous,

    J'ai une requête de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT case `colonne`
    WHEN 'valeur1' then 'group1'
    WHEN 'valeur2' then 'group1'
    ELSE `colonne` AS 'colonne regroupee', SUM(`2010`)
    Group BY 'colonne regroupee'
    Cela fonctionne a merveille, mais je veux maintenant filtrer le résultat avec une clause Having (filtrer uniquement les données affichées sans interferer avec le calcul).

    Si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING 'colonne regroupee' LIKE 'blabla'
    , j'obiens une erreur column unknown 'colonne regroupee' in having clause.

    Si je rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HAVING (case `colonne`
    WHEN 'valeur1' then 'group1'
    WHEN 'valeur2' then 'group1'
    ELSE `colonne`END) LIKE 'blabla'
    J'obtiens unknown column 'colonne' in having clause

    Je dois faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HAVING (case `colonne regroupee`
    WHEN 'valeur1' then 'group1'
    WHEN 'valeur2' then 'group1'
    ELSE `colonne regroupee`END) LIKE 'blabla'
    Donc je ne comprends pas pourquoi je ne peux pas utiliser 'colonne regroupee' directement dans mon having mais que je peux faire un CASE avec.

    Est-ce que j'ai loupé quelque chose ?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Points : 69
    Points
    69
    Par défaut
    Bonjour,
    Chez moi le seul problème de votre requête c'est l'utilisation des cotes simples '.
    si je mets des `` ou même rien, la requête fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select CAST((case
    WHEN `id`=1 or `id`=2 then 'group1'
    WHEN 3 then 'group2'
    ELSE `id` END) as char) AS `colonne_regroupe`, sum(vente) from table_test
    group by `colonne_regroupe`
    HAVING `colonne_regroupe` ='group1';
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select CAST((case
    WHEN `id`=1 or `id`=2 then 'group1'
    WHEN 3 then 'group2'
    ELSE `id` END) as char) AS colonne_regroupe, sum(vente) from table_test
    group by colonne_regroupe
    HAVING colonne_regroupe ='group1';

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Points : 69
    Points
    69
    Par défaut
    Mais je suis en 5.1.
    Je ne sais pas si cela change tout?

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Salut,
    merci pour ta réponse.

    En fait, je viens de comprendre mon erreur, mais je capte encore moins...
    En fait, si j'ai quelque chose comme:
    HAVING `colonne regroupe` LIKE '%' ça marche parfaitement, mais si j'ai
    HAVING UPPER(`colonne regroupe`) LIKE '%'
    Alors ça ne marche pas ... Je ne vois pas pourquoi Des idées ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT `Pays` AS "Pays",
    CASE `Tranche surface`
    WHEN '1000-1999'
    THEN 'Group1'
    WHEN '10000-19999'
    THEN 'Group1'
    ELSE `Tranche surface`
    END AS `Tranche surface Par groupes`, ROUND( SUM( `Nbr 2012` ) ) AS "Nbr 2012"
    FROM basepays
    GROUP BY `Pays` , `Tranche surface Par groupes`
    HAVING 
    UPPER( `Tranche surface Par groupes` ) LIKE UPPER( '%9%' )
     
    ORDER BY `Type de batiments` , `Pays` , `Tranche surface Par groupes` ASC
    LIMIT 0 , 30
    Cela me mets
    #1054 - Unknown column 'Tranche surface Par groupes' in 'having clause'

    Par contre, la colonne "colonne regroupe" n'existe pas dans ma table, j'apelle juste le résultat du case ainsi.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Points : 69
    Points
    69
    Par défaut
    Je maitrise mal ces aspects, mais si vous êtes sous un environnement UNIX, mysql est sensible à la case. y compris pour les noms de champs/tables/schema...

    Est ce votre cas?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Déjà , je ne comprend pas pourquoi vous faites un HAVING, alors que vous pouvez filtrer avec un WHERE...

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Bonjour,
    J'utilise Wamp actuellement, aussi, la casse n'est pas le soucis, car sans la fonction UPPER sur le HAVING, cela fonctionne parfaitement.

    Sinon, j'utilise la fonction HAVING car je veux filtrer les Données après que les calculs aient été effectués.

    Pour Donner un peu le contexte, j'utilise un tableau DataTables http://datatables.net/ avec le traitement server side. Si on utilise WHERE pour filtrer l'affichage, cela vas modifier le résultat des calculs.

    Pour le moment j'utilises du coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HAVING (((UPPER(`Type de batiments`) LIKE UPPER('%test%')) OR (UPPER(CASE `Tranche surface Par groupes` 
    WHEN '1000-1999' THEN 'Group1' 
    WHEN '10000-19999' THEN 'Group1' 
     ELSE `Tranche surface Par groupes` 
     END) LIKE UPPER('%test%'))
    Mais j'aurai préféré avoir des requêtes plus compréhensible du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING (((UPPER(`Type de batiments`) LIKE UPPER('%tes%')) OR (UPPER(`Tranche surface Par groupes`) LIKE UPPER('%tes%'))

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    comme l'explique le cours de SQLPro sur le regroupement,

    la clause HAVING ne s'utilise que sur les colonnes qui utilise des fonctions de regroupement et non juste parce que vous utilisez la clause GROUP BY. Je pense que le WHERE suffit donc.
    une réponse vous a permis d'avancer ?

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Bonjour,
    Sauf erreur de ma part, le filtrage dans la clause WHERE vas filtrer les données avant le Calcul, ce qui pose problème dans mon cas. En fait, Ma page affiche des données dans un tableau, et l'utilisateur peut filtrer l'affichage parmis les données affichées, mais cela ne doit pas modifier le résultat. En utilisant WHERE à la place de HAVING, je me suis rendu compte que les résultats affichés étaient erronés, du fait justement que le filtrage est fait avant le calcul.

    Ou alors cela ne s'applique qu'aux colonnes qui ont une fonction de calcul ?

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Bon en fait il s'agit bien d'une erreur de ma part, je peux utiliser WHERE

    Merci à tous !

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 10h09
  3. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 17h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 08h29

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