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

Développement SQL Server Discussion :

case when + select d'une valeur


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut case when + select d'une valeur
    Bonjour,

    Je suis en train de corriger un rapport existant et il y a une sélection que je voudrais changer.
    Ce rapport est assez complexe et pour avoir une vision plus claire de mon problème, j'ai juste sélectionné les champs importants.

    Voici la query simplifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select 
    sl.ship_id, o.ordnum, o.batch_nr, 
    case when o.ordnum = (select min(o3.ordnum) from ord o3 left join shipment_line sl3 on (o3.ordnum = sl3.ordnum) where sl3.ship_id = sl.ship_id) 
    then 'Calcul' 
    else 'invalid' + (select min(o3.batch_nr) from ord o3 left join shipment_line sl3 on (o3.ordnum = sl3.ordnum) where sl3.ship_id = sl.ship_id) end Total price 
    from ord o
    cette query me donne le résultat suivant:
    Ship ID order nr batch nr total price
    123456 0551111 911 100 EUR
    123456 0551112 902 Invalid 902
    123456 0551113 905 invalid 902

    Analyse du 'select case when':
    Lorsque ordnum = min(ordnum) pour les ordnum ayant le même ship_id, alors cela donne 'calcul'. Dans mon exemple, cela équivaut à 100 EUR.
    Sinon, cela sélectionne 'invalid' + la plus petite valeur de 'batch_nr' pour les ordnum ayant le même ship_id

    Mon souhait est de changer le 'else' afin de sélectionner le batch_nr pour lequel le calcul est présent (dans cet example: sélectionner le batch_nr pour lequel 100 EUR est calculé c.à.d 911).

    Le résultat souhaité serait celui-ci:

    Ship ID order nr batch nr(reffld_5) total price
    123456 0551111 911 100 EUR
    123456 0551112 902 invalid 911
    123456 0551113 905 invalid 911


    J’ai tenté de changer la query en appliquant la logique suivante mais cela me retourne aucune valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case when o.ordnum = (select min(o3.ordnum) from ord o3 left join shipment_line sl3 on (o3.ordnum = sl3.ordnum) where sl3.ship_id = sl.ship_id) 
    then 'calcul' 
    else 'invalid' + (select (o3.btach_nr) from ord o3 left join shipment_line sl3 on (o3.ordnum = sl3.ordnum) where sl3.ship_id = sl.ship_id and o.ordnum = (select min(o3.ordnum) from ord o3 where sl3.ship_id = sl.ship_id) ) 
    end
    Merci pour votre aide.

    imco20030

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Votre requête est incomplète, vous n'avez pas donné les jointures avec les alias SL et SL3, donc il est difficile de vous répondre ...

    Sous quelle version de SQL Server travaillez-vous ? 2000, 2005 ou 2008 ?

    Pensez à la balise [code] (bouton # à droite dans la barre d'outils )

    @++

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    Bonjour,

    voici la jointure:
    left join shipment_line sl on (o.ordnum = sl.ordnum)

    Je crois que c'est SQL Server 2005.

    A quoi sert la balise code?

    Merci

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    voici la jointure:
    left join shipment_line sl on (o.ordnum = sl.ordnum)
    OK, et pour SL3 ?

    Je crois que c'est SQL Server 2005.
    Vous pouvez vérifier quelle est votre version de SQL Server en jetant ou œil ici

    A quoi sert la balise code?
    Tout simplement à mettre votre code en forme sur le site, de sorte qu'il soit plus agréable à lire pour tous

    @++

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    SL3 est la table shipment_line, tout comme SL. Celle-ci est utilisé pour vérifier les valeurs appartenant a la même colonne: sl3.ship_id = sl.ship_id

    C'est la version 2008.

    Merci pour le conseil.

    imco20030

Discussions similaires

  1. Sélection d'une valeur vide pour un select
    Par Tiaps dans le forum Struts 1
    Réponses: 2
    Dernier message: 30/06/2006, 10h20
  2. Réponses: 2
    Dernier message: 17/05/2006, 18h19
  3. [vb.net][dataset] Select : retrouver une valeur
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/01/2006, 17h26
  4. Réponses: 5
    Dernier message: 31/10/2005, 13h25
  5. Selection d'une valeur dans une autre table
    Par beurnoir dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h02

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