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 :

Case versus Where


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Par défaut Case versus Where
    Bonjour, j'ai une requête ou je dois utiliser des Case. J'ai simplifié ici pour le besoin.
    Quand j'utilise un Case, cela donne un contage que je sais invalide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT Asso, 
    Case when (mac.debut <= '2010-06-30')  and (mac.debut >= '2009-07-01')
    then Sum(mac.fin - mac.debut) end as jrs
    FROM `cumul`.`fmr1mac` mac
    group by asso;
     
    Asso	jrs
    	NULL
    AF	NULL
    AH	NULL
    AI	NULL
    AJ	NULL
    AK	NULL
    Voici la même requête avec la même condition dans un Where et voilà le résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Asso, Sum(mac.fin - mac.debut) as jrs
    FROM `cumul`.`fmr1mac` mac
    where (mac.debut <= '2010-06-30') and (mac.debut >= '2009-07-01')
    group by asso;
     
    Asso	jrs
    	10109
    AF	9929
    AH	10123452
    AI	9615993
    AJ	6734392
    AK	5340157
    Je ne vois pas ou je fais une erreur de logique ou autre.

    Merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    La fonction COUNT() n'est pas faite pour faire autre chose que de compter des lignes. Ton Count(mac.fin - mac.debut) n'a aucun sens.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Par défaut Case versus Where
    Merci, tu as tout a fait raison.
    J'ai donc changé Count pour Sum et j'ai tout de même encore le problème.
    Le nombre de jours avec est différent avec Sum() mais le résultat est encore NULL avec le Case.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Et SUM, comme COUNT, est une fonction de groupage.
    Pour faire des calculs sur des dates, utilise les fonctions de date de MySQL.

    Et plutôt que le couple <= et >=, utilise plutôt le couple BETWEEN... AND.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Par défaut Case versus Where
    Bonjour, oui je comprends que Sum() est une fonction de groupage et c'est exactement ce que je veux faire. Compter le nombre de jours homme par Asso.

    Bon, en préparant une petite table pour vous l'envoyer, je me suis aperçu que la requête avec le Case fonctionne sur celle-ci donc il y a un record(s) avec une date dans la table qui est invalide.
    Comment pourrai-je trouver cellui-ci puisque je n'ai pas de message d'erreur quand on me renvoie des NULL. Cette table fait 250,000 records ...

    Merci

    Yves

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Yves Archambault Voir le message
    Bonjour, oui je comprends que Sum() est une fonction de groupage et c'est exactement ce que je veux faire. Compter le nombre de jours homme par Asso.
    OK pour ta somme mais la soustraction de dates pour compter un nombre de jours entre deux dates, ce n'est pas comme ça.

    Petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '2012-03-28' - '2012-03-20'
    Résultat : 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATEDIFF( '2012-03-28', '2012-03-20' )
    Résultat : 8

    Bon, en préparant une petite table pour vous l'envoyer, je me suis aperçu que la requête avec le Case fonctionne sur celle-ci donc il y a un record(s) avec une date dans la table qui est invalide.
    Comment pourrai-je trouver cellui-ci puisque je n'ai pas de message d'erreur quand on me renvoie des NULL. Cette table fait 250,000 records ...

    Merci

    Yves
    NULL est un marqueur d'absence de valeur, ce n'est pas une erreur. Si tu as des NULL dans les dates et que tu fais des opérations dessus, ça peut être normal que le résultat du calcul soit NULL lui aussi.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Par défaut Case versus Where
    Bonjour, après avoir soumis le cas à Oracle, la réponse est qu'il faut mettre le case dans le Sum().

    ex. : SUM(CASE WHEN(condition) THEN field END)

    et cela fonctionne très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT Asso, 
    Sum(Case 
          when mac.debut <= Date('2010-06-30')  AND mac.debut >= Date('2009-07-01') 
            then if((mac.fin > Date('2010-06-30')), 
                   (DateDiff(Date('2010-06-30') , mac.debut) +1),
                   (DateDiff(mac.fin , mac.debut) +1))
          when mac.fin <= Date('2010-06-30')  AND mac.fin >= Date('2009-07-01') 
            then if((mac.debut < Date('2009-07-01')), 
                   (DateDiff(mac.fin, Date('2009-07-01')) +1),
                   (DateDiff(mac.fin , mac.debut) +1))
          end ) as jrs
    FROM `cumul`.`fmr1mac` mac
    GROUP BY asso;
    Merci à tous.

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Il vaut mieux utiliser BETWEEN que le couple <= et >=
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

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

Discussions similaires

  1. Case dans Where (encore !)
    Par yservant dans le forum SQL
    Réponses: 3
    Dernier message: 31/01/2013, 18h08
  2. Oracle : Case dans Where qui retourne une liste
    Par stof dans le forum Oracle
    Réponses: 9
    Dernier message: 29/07/2011, 10h21
  3. join outer/inner versus where
    Par siimpatiico dans le forum Débuter
    Réponses: 4
    Dernier message: 10/02/2010, 17h53
  4. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07
  5. IS IN versus WHERE ... = ...
    Par Neilos dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/06/2005, 15h16

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