case when + Selection d'une valeur - SQL/NoSQL - Programmation
MarshPosté le 03-11-2009 à 22:04:31
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é:
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 : 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
Marsh Posté le 03-11-2009 à 22:04:31
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é:
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 :
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