Soucis de retour dans une requête SQL
matours
-
swed -
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
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
A voir également:
- Soucis de retour dans une requête SQL
- Excel retour à la ligne dans une formule - Guide
- Retour à la ligne chatgpt ✓ - Forum MacOS
- Retour à la ligne google sheet ✓ - Forum Bureautique
- Google Sheet : Retour à la ligne à l'intérieur d'une formule - Forum Excel
- Logiciel sql - Télécharger - Bases de données
9 réponses
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 ;
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 ;
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.
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
Autres astuces de nos amis développeur et gestionnaire de BDD
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.
SELECT MAX(CAST(substr(id_com,10))as int) FROM commande ;
Voilou, je comprends pas.
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
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
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
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
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.
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.