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 :

Condition : si multiple = 0,5 si unique = 1


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Condition : si multiple = 0,5 si unique = 1
    Bonjour,

    J'ai une table avec :
    date - Nom - Nbr Heure travaillée - type absence - nbre heure absences

    01/02/2016 - Mr X - 8 - Null - 0
    02/02/2016 - Mr X - 0 - CP - 7
    01/02/2016 - Mr Y - 5 - Null - 0
    01/02/2016 - Mr Y - 0 - CP - 3

    Je voudrai pouvoir obtenir le nombre de jour d'absence sachant que si
    - sur la même date heures travaillées >0 et heures absences >0 = 0,5 Jour
    - sur la même date heures travaillées <0 et heures absences >0 = 1 Jour
    - sur la même date heures travaillées >0 et heures absences <0 = 0 Jour

    Je n'arrive pas à mettre un count en condition avec un IF.

    Merci de votre aide

    Christophe

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Je dirai que le plus simple est de faire une sous-requête qui calcule les sommes par client/date, ainsi dans la requête "principale" de simples CASE suffisent.

    Tatayo.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 874
    Points : 53 048
    Points
    53 048
    Billets dans le blog
    6
    Par défaut
    Le IF n'existe pas en SQL. Utilisez le CASE. A lire : http://sqlpro.developpez.com/cours/sqlaz/select/#L7
    A +

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Je dirai que le plus simple est de faire une sous-requête qui calcule les sommes par client/date, ainsi dans la requête "principale" de simples CASE suffisent.

    Tatayo.
    Peux-tu écrire un exemple ? Je ne suis pas assez pro pour comprendre comme cela...

    Merci

  5. #5
    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,

    comme ceci ?

    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
    16
    17
    18
    19
    20
    21
     
    SELECT 
    		nom
    	,	SUM(NbJours)
    FROM	(
    	SELECT 
    			nom
    		, CASE
    			WHEN MAX(NbHeuresTrav) > 0 THEN 
    				CASE 
    					WHEN MAX(NbHeureAbs) > 0 THEN 0.5
    					ELSE 1 
    				END
    			ELSE 0
    			END AS NbJours
    	FROM	LaTable
    	GROUP BY 
    			nom
    		,	dte
    ) AS T
    GROUP BY nom

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Qu'est-ce qui empêche de faire le CASE à l'intérieur du SUM() ?

    Certes, d'un point de vue lisibilité c'est pas forcément ce qu'il y a de mieux, mais ça me semble plus "propre" que de passer par une sous-requête qui peut potentiellement envoyer l'optimiseur sur une mauvaise piste.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 243
    Points : 12 874
    Points
    12 874
    Par défaut
    Parce que dans la question, le CASE porte justement sur le résultat du SUM().
    Dans l'exemple, pour Mr Y et pour le 01/02/2016, le nombre d'heure travaillées est de 5 et le nombre d'heures d'absence est de 3, mais ces deux valeurs sont dans deux lignes de la table.
    Il faut donc en premier calculer les sommes, et ensuite appliquer le CASE sur les résultats.
    Enfin c'est mon point de vue...

    Tatayo.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Ça m'apprendra à lire en diagonale

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Mille merci, et voici une nouvelle difficulté que je n'avais pas vu au départ :

    date - Nom - Nbr Heure travaillée - type absence - nbre heure absences

    01/02/2016 - Mr X - 8 - Null - 0
    02/02/2016 - Mr X - 0 - CP - 7
    01/02/2016 - Mr Y - 5 - Null - 0
    01/02/2016 - Mr Y - 0 - CP - 3
    01/02/2016 - Mr Z - 0 - JF - 7 Ce code "absence" doit être exclu de mon résultat ou autrement dit je e veux que le code "CP" dans mon résultat.

    Si j'ajoute une ligne qui dit "where type absence = CP" je ne récupère plus les lignes sans absence et je ne peux plus trouver mes 1/2 jours ?

    Merci encore une fois par avance

    Christophe

  10. #10
    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
    il suffit dans le where d'inclure les lignes où le type d'absence est NULL en plus de celles où il est égal à 'CP'

  11. #11
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Pff....

    ça a l'air si simple quand tu l'écris !!

    Super Merci beaucoup aieeeuuuuu

    Belle journée

  12. #12
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Juste une petite pour la route lol

    Est-il possible de faire apparaitre dans le résultat :
    Date (OK)
    Nom (OK)
    Heures travaillées (OK)
    Heures absences (OK)

    Type absences (???)

    Merci

  13. #13
    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
    le problème c'est qu'il y a un groupage par date, puis par nom.

    comment faire donc si quelqu'un pose un RTT le matin, et un CP l'après midi ?

    cela dit, vous pouvez inclure le type d'absence dans le regroupement, mais le résultat ne sera plus le même : vous aurez une ligne par nom/type d'absence

  14. #14
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2003
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    merci,

    C'est ce que j'avais aperçu, mais je me demandais si une solution miracle n'existait pas !!

    belle journée

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

Discussions similaires

  1. condition logiques & multiples
    Par sulliwane dans le forum MATLAB
    Réponses: 2
    Dernier message: 24/12/2009, 13h23
  2. condition if multiple
    Par davelop dans le forum ASP
    Réponses: 4
    Dernier message: 30/09/2009, 09h42
  3. condition "OR" multiple
    Par nicerico dans le forum MySQL
    Réponses: 2
    Dernier message: 19/03/2009, 16h43
  4. classements multiples en 1 requete uniquement
    Par warpyou dans le forum Requêtes
    Réponses: 20
    Dernier message: 06/06/2006, 15h26
  5. Condition If multiple
    Par M1000 dans le forum ASP
    Réponses: 2
    Dernier message: 01/03/2004, 13h46

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