Soucis de retour dans une requête SQL

matours -  
 swed -
Salut à tous.
Je bosse actuellement sur un système de gestion de commande ou le numéro de la commande fonctionne ainsi : DateduJour-N°Fact.
Ce qui donne par exemple 20100319-1 pour la première commande passée aujourd'hui.

J'en ai donc toute une liste.
20100318-1 et ceux jusqu'à 20100318-19.

Je dois récupérer le numéro de la facture et l'auto incrémenter à la main (c'est bizarre dit comme ça). J'utilise donc une requête, qui est la suivante :

SELECT MAX(substr(id_com,10)) FROM commande WHERE LEFT(id_com,8) = '20100318'

De cette manière il est sensé me renvoyer le 19, mais il me renvoi seulement 9.
Si quelqu'un à une idée de solution, ça serait du pur bonheur.

Je travaille sous mysql et avec du php.

Merci à tous

9 réponses

swed
 
Bonjour,
Effectivement, j'ai l'habitude d'Oracle,
L'équivalent de TO_NUMBER() en MySQL est CAST()
1
swed
 
Bonjour,
Tu as spécifié le type INT au mauvais endroit ;
Essayes comme ca plutot :
SELECT MAX( CAST(substr(id_com,10) AS INT) ) FROM commande ;
1
swed
 
Bonjour,
Sinon, seconde solution, sans convertir en nombre :
MAX ( LPAD( RTRIM( substr(id_com,10) ), 2, '0') )

Le rtrim te supprime les espaces à droite : "9 " devient "9"
Puis le lpad t'ajoutes les zéros à gauche : "9" devient "09"

Et donc dans ce cas, ton MAX fonctionnera

Cordialement,
M.
1
swed
 
Bonjour,

C'est normal car dans ce cas il compare les chaines de caractères.
Et la chaine "9 " est plus grande que "19"

Il faut donc que tu ajoutes un TO_NUMBER :
SELECT MAX(TO_NUMBER(substr(id_com,10))) ...

Cordialement,
M.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
matours
 
Je viens de tester ta solution, dont je remercie la vitesse à laquelle tu me l'as faites parvenir. Mais mysql me dit que la fonction TO_NUMBER n'existe pas.

Autres astuces de nos amis développeur et gestionnaire de BDD
0
matours
 
On va finir par croire que j'y met de la mauvaise volonté, ou alors j'orthographie mal ma requête. Dîtes moi ce que vous en pensez.

SELECT MAX(CAST(substr(id_com,10))as int) FROM commande ;

Voilou, je comprends pas.
0
matours
 
J'avais bien spécifié mon type au mauvais endroit, mais il ne faut pas mettre INT.
Je met ma solution pour ce qui pourrait en avoir besoin :

SELECT MAX( CAST(substr(id_com,10) AS SIGNED) ) FROM commande ;

Merci à toi Swed
0
matours
 
J'ai de nouveau besoin de vos lumière.
Toujours sur des fonctions SQL, quand une commande doit être payé, elle peut être payé en plusieurs fois. Paiement qui seront facturés sous la forme d'acompte.

ma requête :
SELECT MAX(RIGHT(id, 1)AS SIGNED) FROM ".$table_detail_paiement." WHERE id_com = '".$commande."'

Je m'explique, l'id de mon acompte est sous cette forme (id_commande_AC_N°Acompte) => ce qui donne par exemple 20100319-1_AC1 pour le premier acompte de la première facture du jours.

mais par exemple, si j'ai 10 acompte, il me faut pouvoir récupérer le 10.
Le soucis, avec ma fonction RIGHT, c'est que tel qu'elle présentée, il ne récupère mon acompte 20100319-1_AC10 .

Mais si je lui colle RIGHT(id, 2), je ne parvient pas à récupérer les acomptes ou le numéro est inférieur à 10...

merci de vos réponses.

matours
0
swed
 
Re,
Ca va te faire une requête bien moche. Je pense que la base de données est mal conçue, et que ces données auraient dû être séparées dans différent champs plutôt que concaténées dans un seul.

Mais bon, tu peux t'en sortir avec un CASE dans ce style :

SELECT MAX(NUMACOMPTE)
FROM (
select id, id_com, CASE LEFT(RIGHT(id, 2), 1)
WHEN '-' THEN RIGHT(id, 1)
ELSE RIGHT(id, 2)
END as NUMACOMPTE
FROM ".$table_detail_paiement."
)
WHERE id_com = ....

(pas testé, c'est pour te donner une idée...)
Cordialement, M.
0