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 :

Somme d'enregistrements utilisant une condition


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 93
    Points : 47
    Points
    47
    Par défaut Somme d'enregistrements utilisant une condition
    Bonjour,
    Je travaille sur une extraction SQL à partir de SQL Serveur afin de générer un rapport.

    Pour simplifier le problème, j'ai 2 tables qui contiennent le type d'enregistrements suivant:

    TBLE_USAGE
    ---------------------------------------------
    ID | RES | HEURES_SUPP |
    ---------------------------------------------
    1 | Pierre | 7.5
    ---------------------------------------------
    2 | Steve | 12
    ---------------------------------------------
    3 | Claire | 4

    TBLE_RES
    ---------------------------------------------
    ID | RES | RES_MANAGER|
    ---------------------------------------------
    1 | Pierre | Elise
    ---------------------------------------------
    2 | Steve | Elise
    ---------------------------------------------
    3 | Thierry | Eric

    Voilà je souhaiterais avoir la somme des heures supplementaires qu'ont réalisé les employés sous la direction de ELISE.

    Voici ma requête qui fonctionne correctement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT SUM(HEURES_SUPP) AS TOTAL_ELISE
    FROM TBLE_USAGE 
    WHERE TBLE_USAGE.RES IN (SELECT RES FROM TBLE_RES WHERE RES_MANAGER='ELISE')
    Maintenant je voudrais l'imbriquer dans ma requête générale qui va me générer mon rapport. J'utilise donc le CASE. C'est le cas via la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SUM(CASE RTRIM(RES)
    	WHEN 'PIERRE' THEN TBLE_USAGE.HEURES_SUPP
    	WHEN 'STEVE' THEN TBLE_USAGE.HEURES_SUPP
    ELSE 0
       END) AS "TOTAL_ELISE"
    FROM TBLE_USAGE, TBLE_RES
    Cela fonctionne correctement mais le problème c'est que si je suis obligé d'entrer le nom des employés sous la direction de ELISE dans mon script SQL, bonjour la galère si 'il y en a beaucoup...

    Donc j'ai essayer d'utiliser une variable mais ça ne marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE @var varchar
    SET @var = (SELECT RES FROM TBLE_RES WHERE RES_MANAGER='ELISE')
    SUM(CASE RTRIM(RES)
    	WHEN @VAR THEN HEURES_SUPP
    	ELSE 0
       END) AS "TOTAL_ELISE"
    Voici l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Server: Msg 512, Level 16, State 1, Line 2
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
     
    (1 row(s) affected)
    Bon voilà je pense que ce n'ai pas possible avec le CASE...

    Est-ce que vous auriez une idée s'il vous plaît parce que là je rame.
    Merci

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je suppose que RES est l’identifiant de la personne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT RES_MANAGER, SUM(HEURES_SUPP)
    FROM TBLE_USAGE INNER JOIN TBLE_RES USING (RES)
    GROUP BY RES_MANAGER
    Tu peux aussi faire un RIGHT OUTER JOIN si tu veux les managers pour lesquels personne n'a fait d'heures supp.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 93
    Points : 47
    Points
    47
    Par défaut
    Oui c'est l'identifiant de la personne. Le code me parait pas mal du tout, Merci, mais ça me donne l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'RES' is not a recognized OPTIMIZER LOCK HINTS option
    Une idée?

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT RES_MANAGER, SUM(HEURES_SUPP)
    FROM TBLE_USAGE u INNER JOIN TBLE_RES r ON u.RES = r.RES
    GROUP BY RES_MANAGER
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 93
    Points : 47
    Points
    47
    Par défaut
    Ah je suis désolé, j'ai fait une petite erreur.Mes deux tables contiennent des ressources mais ce n'ai pas le même nom de champ.

    Pour la table TBLE_USAGE c'est bien RES mais pour la table TBLE_RES le champ ressource est désigné par le champ RESSOURCE.
    Les deux noms sont différents mais contiennent vraiment le même type de données (nom des employés)

    Désolé pour la confusion mais j'essaie de transposer mon problème à un cas simple pour le forum. (Juste pour info, ma base de données contient des info de coût car interfacé avec un logiciel de valeur acquise...)

    Donc pour revenir à la requête, je l'ai légèrement modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT RES_MANAGER, SUM(HEURES_SUPP) 
    FROM TBLE_USAGE u INNER JOIN TBLE_RES r ON u.RES = r.RESSOURCE 
    GROUP BY RES_MANAGER
    Mais ça me donne pluseurs fois l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Ambiguous column name 'RES'.
    Server: Msg 209, Level 16, State 1, Line 1
    Je confirme que RES est bien présent dans ma table TBLE_USAGE

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/03/2010, 11h29
  2. Macro enregistrée ajouter une condition if blank then
    Par FreddyNB dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/06/2009, 18h12
  3. Somme des enregistrements d'une requête
    Par manu971 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/10/2007, 14h35
  4. [ireport] - utiliser une condition sur un field
    Par karibouxe dans le forum iReport
    Réponses: 11
    Dernier message: 15/02/2007, 15h48
  5. somme de cellule avec une condition
    Par fullcircle dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/06/2006, 07h17

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