OVH Cloud OVH Cloud

MAX et requête SQL

8 réponses
Avatar
kt.marti
Bonjour,

j'ai la table COMMANDE compos=E9e des champs suivants :

CD_NUMERO, CD_DATE, CD_HEURE, CD_CODE, CD_UTIL, CD_SIGNAT

Il faut que je r=E9cup=E8re pour chaque num=E9ro de commande (CD_NUMERO)
la date la plus r=E9cente (CD_DATE) ainsi que l'heure la plus r=E9cente
(CD_HEURE) de la date la plus r=E9cente, pour tous les CD_CODE=3D'SIG'. En
fait une commande n'est pas unique : il y a plusieurs lignes contenant
le m=EAme CD_NUMERO. Une commande peut donc =EAtre pass=E9e plusieurs fois
le m=EAme jour (=E0 des heures diff=E9rentes. On a donc des CD_DATE =E9gaux
mais des CD_HEURES diff=E9rents) o=F9 =E0 des dates diff=E9rentes.

Apr=E8s plusieurs tentatives je s=E8che car je dois r=E9cup=E9rer 2 MAX
mais qui d=E9pendent l'un de l'autre et de plus cette table ne poss=E8de
pas d'ID unique qui permet d'identifier une ligne sp=E9cifiquement.

Si quelqu'un a la solution je suis preneur.

Merci d'avance !

KT

8 réponses

Avatar
JustMe
a pensé très fort :
Bonjour,

j'ai la table COMMANDE composée des champs suivants :

CD_NUMERO, CD_DATE, CD_HEURE, CD_CODE, CD_UTIL, CD_SIGNAT

Il faut que je récupère pour chaque numéro de commande (CD_NUMERO)
la date la plus récente (CD_DATE) ainsi que l'heure la plus récente
(CD_HEURE) de la date la plus récente, pour tous les CD_CODE='SIG'. En
fait une commande n'est pas unique : il y a plusieurs lignes contenant
le même CD_NUMERO. Une commande peut donc être passée plusieurs fois
le même jour (à des heures différentes. On a donc des CD_DATE égaux
mais des CD_HEURES différents) où à des dates différentes.

Après plusieurs tentatives je sèche car je dois récupérer 2 MAX
mais qui dépendent l'un de l'autre et de plus cette table ne possède
pas d'ID unique qui permet d'identifier une ligne spécifiquement.

Si quelqu'un a la solution je suis preneur.

Merci d'avance !

KT



Quels sont les types de CD_DATE et CD_HEURE ?
Quelle base de données ?
Avatar
Etienne SOBOLE
le même CD_NUMERO. Une commande peut donc être passée plusieurs fois
le même jour (à des heures différentes. On a donc des CD_DATE égaux
mais des CD_HEURES différents) où à des dates différentes.

peut etre une conversion en entier des date et un addition subtile ;)
j'avoue que je ne sais pas faire mais un truc genre
max(CD_DATE + CD_HEURES)
ca ne marche pas?

peut etre faut il tout convertir en timestamp avant...
a creuser.

Etienne
Avatar
kt.marti
CD_DATE et CD_HEURE sont respectivement des char(8) et char(6).
Par exemple CD_DATE='20011001' et CD_HEURE='111018'.
Je travaille sur SQL Server 2000.
Merci !
Avatar
kt.marti
En fait j'avais fait une requête en cherchant un MAX(CD_DATE+CD_HEURE)
avec un GROUP BY sur CD_NUMERO. Ca fonctionne mais mon problème est
ensuite de pouvoir récupérer toutes les infos de la table ...
Avatar
Etienne SOBOLE
En fait j'avais fait une requête en cherchant un MAX(CD_DATE+CD_HEURE)
avec un GROUP BY sur CD_NUMERO. Ca fonctionne mais mon problème est
ensuite de pouvoir récupérer toutes les infos de la table ...



hum.
je dois dire que je comprends pas.
tu met tout les champs dans le group by !!! il est ou le probleme?

Etienne
Avatar
kt.marti
Le problème est que je ne veux faire un group by que sur le champ
CD_NUMERO. Si j'ajoute tous les champs le résulat de ma requête est
faux car il prend en compte tous les champs alors que je ne veux
grouper que par numéro de commande ...
Avatar
Antoun
wrote:
Bonjour,

j'ai la table COMMANDE composée des champs suivants :

CD_NUMERO, CD_DATE, CD_HEURE, CD_CODE, CD_UTIL, CD_SIGNAT

Il faut que je récupère pour chaque numéro de commande (CD_NUMERO)
la date la plus récente (CD_DATE) ainsi que l'heure la plus récente
(CD_HEURE) de la date la plus récente, pour tous les CD_CODE='SIG'. En
fait une commande n'est pas unique : il y a plusieurs lignes contenant
le même CD_NUMERO. Une commande peut donc être passée plusieurs fois
le même jour (à des heures différentes. On a donc des CD_DATE égaux
mais des CD_HEURES différents) où à des dates différentes.

Après plusieurs tentatives je sèche car je dois récupérer 2 MAX
mais qui dépendent l'un de l'autre et de plus cette table ne possède
pas d'ID unique qui permet d'identifier une ligne spécifiquement.

Si quelqu'un a la solution je suis preneur.

Merci d'avance !

KT




Pour cela, il te faut une sous-requête qui détermine la date-heure et
une requête qui lit les autres infos... Ton idée d'utiliser
CD_DATE+CD_HEURE est bonne, elle permet d'éviter une sous-requête
supplémentaire.

Comme je ne me rappelle plus plus trop si on doit/peut mettre les AS en
SQL Server, je les ai mis partout pour plus de clarté.

SELECT C.*
FROM COMMANDE C
INNER JOIN
( SELECT C2.CD_NUMERO, MAX(C2.CD_DATE + C2.CD_HEURE) AS DateHeure
FROM COMMANDE C2
) AS D
ON C.CD_NUMERO = D.CD_NUMERO
AND C.CD_DATE + C.CD_HEURE = D.CD_DATE + D.CD_HEURE
WHERE CD_CODE = 'SIG'
Avatar
kt.marti
Merci beaucoup pour ta requête ... mais j'obtiens les messages
d'erreur suivants :
'CD_DATE' : Nom de colonne incorrecte
'CD_HEURE' : Nom de colonne incorrecte

Il précise que cette erreur se situe à la première ligne. J'obtiens
la même chose si j'écris tous les noms de champs et en omettant
CD_DATE et CD_HEURE.

PS : SQL Server accepte bien les AS