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 :

requête condition sur plusieurs champs


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut requête condition sur plusieurs champs
    Bonjour,

    je dispose de la table composée des propriétés suivantes :

    codeclient
    anneevente
    montant

    codeclient est l'identifiant du client
    anneevente va de 2003 à 2007
    montant est le montant de la vente

    je voudrais sortir en une seule requête la somme des montants pour 2003, 2004, 2005, 2006 et 2007 pour le client 'BONJOUR'

    le résultat doit être du style :

    CLIENT 2003 2004 2005 2006 2007
    -----------------------------------------------
    BONJOUR 100 105 104 200 250


    j'utilise SQLServer 2000
    Auriez vous une idée pour faire cette opération en une seule requête ? Moi après m'être arraché les cheveux, je sèche !!!

    merci !

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    en une seule requete tu ne peux pas faire ca, faut passer par une procedure stockée
    j'suis vert !

  3. #3
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    OK, merci !

  4. #4
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Ton SGBD reconnait-il la fonction IIF() ?

  5. #5
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
      codeclient,
      sum(case anneevente when '2003' then 1 else 0 end) "2003",
      sum(case anneevente when '2004' then 1 else 0 end) "2004",
      sum(case anneevente when '2005' then 1 else 0 end) "2005",
      sum(case anneevente when '2006' then 1 else 0 end) "2006",
      sum(case anneevente when '2007' then 1 else 0 end) "2007"
    from ta_table
    where codeclient = 'BONJOUR'
    group by codeclient
    Mais bon les années sont en dur
    Je penche, donc je suis

  6. #6
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    chrinfo, il me semble que ta requête compte le nombre de ventes plutôt que d'en faire la somme. A mon avis, tu voulais plutôt écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select 
      codeclient,
      sum(case anneevente when '2003' then montant else 0 end) "2003",
      sum(case anneevente when '2004' then montant else 0 end) "2004",
      sum(case anneevente when '2005' then montant else 0 end) "2005",
      sum(case anneevente when '2006' then montant else 0 end) "2006",
      sum(case anneevente when '2007' then montant else 0 end) "2007"
    from ta_table
    where codeclient = 'BONJOUR'
    group by codeclient
    Personnellement, j'avais pensé à une autre solution, qui est équivalente (mais peut-être moins performante du fait des sous-requêtes) :
    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
    22
    23
    24
    25
     
    SELECT codeclient,
           (SELECT SUM(montant)
            FROM   test1
            WHERE  anneevente = '2003'
                   AND codeclient = T.codeclient) AS [2003],
           (SELECT SUM(montant)
            FROM   test1
            WHERE  anneevente = '2004'
                   AND codeclient = T.codeclient) AS [2004],
           (SELECT SUM(montant)
            FROM   test1
            WHERE  anneevente = '2005'
                   AND codeclient = T.codeclient) AS [2005],
           (SELECT SUM(montant)
            FROM   test1
            WHERE  anneevente = '2006'
                   AND codeclient = T.codeclient) AS [2006],
           (SELECT SUM(montant)
            FROM   test1
            WHERE  anneevente = '2007'
                   AND codeclient = T.codeclient) AS [2007]
    FROM   test1 AS T
    WHERE  codeclient = 'BONJOUR'
    GROUP BY codeclient;
    A tester bien sûr, parce que je le fais un peu à l'arrache !

    Quoi qu'il en soit, le problème des années écrites en dur dans la requête est toujours là.
    Sous Access, on pourrait utiliser une requête PIVOT pour ne pas avoir à les écrire en dur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TRANSFORM SUM(montant)
    SELECT codeclient
    FROM test1
    WHERE codeclient="BONJOUR"
    GROUP BY codeclient
    PIVOT anneevente;
    Mais sous SQL Server, c'est plus compliqué.
    Maintenant, il faut dire qu'en théorie, le fait de vouloir présenter les données en colonnes plutôt qu'en lignes est plus une question de cosmétique qu'une question de SQL, dont plutôt à faire traiter par l'application cliente que par le SGBD.
    Néanmoins, comme ça peut toujours servir de savoir le faire, l'équipe du site nous a écrit un bon petit article sur le sujet.

  7. #7
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Citation Envoyé par J1
    chrinfo, il me semble que ta requête compte le nombre de ventes
    Oui oui désolé, j'étais HS, c'est bien la somme des montants que veut grinder59.
    Je penche, donc je suis

  8. #8
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Merci beaucoup pour votre aide... Je ne connaissais pas le CASE WHEN THEN...

    Dernière question... le champs de mon année de vente n'est pas un entier mais une date... donc en fait, je veut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE anneevente WHEN anneevente LIKE '%2004%' THEN montant ELSE 0
    Je suis sur SQL Server 2000.
    est-ce possible ? car mes multiples essais ne me renvoient que des insultes...

    Merci

  9. #9
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Essaie

    A+

  10. #10
    Membre actif Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 707
    Points : 215
    Points
    215
    Par défaut
    Merci...

    j'avais finalement réussi à le faire avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...CASE WHEN anneevente LIKE '%2004%' THEN montant ELSE...
    Mais je suppose que c'est la même chose...

    Merci pour tout !!!

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

Discussions similaires

  1. [PDO] Requête SELECT sur plusieurs champs
    Par mathws dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/03/2009, 20h08
  2. Requête faite sur plusieurs champs provenant de plusieurs tables
    Par olivier777 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 14/05/2008, 17h34
  3. Requête : distinct sur plusieurs champs
    Par bractar dans le forum Langage SQL
    Réponses: 13
    Dernier message: 08/06/2007, 19h54
  4. requête max sur plusieurs champs
    Par logica dans le forum Access
    Réponses: 3
    Dernier message: 28/03/2006, 16h31
  5. Problème de requête avec cumul des conditions sur un champ
    Par UtopieAmbiante dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2006, 10h52

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