requete

Le
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete suivante
sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il me
faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand meme
tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles LE BARBIER
Le #11858371
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete suivante
sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il
me faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand
meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide



Le #11858351
merci gilles la requete fonctionne
le traitement est malheureusement tres tres long (il y a 42000 enr au debut
et 22000 apres traitement)
peut on faire mieux ?

j'ai essayé mais sans succes sauf en traitant en 2 temps passant par une
premiere requete codeetmaxdate

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART;

puis par une seconde utilisant la premiere

SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF INNER JOIN codeetmaxdate ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART);

c'est pas tres "beau" mais ca va beaucoup + vite
ne peut on pas compiler les 2 requetes en une seule


"Gilles LE BARBIER" message de news:e1Ysjm$
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete suivante
sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il me
faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand
meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide





Patrice
Le #11858311
D'une facon générale il est possible de faire :

SELECT .. FROM ...
JOIN (SELECT ... FROM ...) AS m ON m.Champ=AutreChamp
etc...

Donc ici qq chose comme :

-- Récupérer les données
SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF
-- qui correspondent à la dernière date par TAART
INNER JOIN
(SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART)

(non testé).

Pour la rapidité voir aussi si les index sont en place...


merci gilles la requete fonctionne
le traitement est malheureusement tres tres long (il y a 42000 enr au
debut et 22000 apres traitement)
peut on faire mieux ?

j'ai essayé mais sans succes sauf en traitant en 2 temps passant par une
premiere requete codeetmaxdate

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART;

puis par une seconde utilisant la premiere

SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF INNER JOIN codeetmaxdate ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART);

c'est pas tres "beau" mais ca va beaucoup + vite
ne peut on pas compiler les 2 requetes en une seule


"Gilles LE BARBIER" message de news:e1Ysjm$
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete suivante
sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il
me faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand
meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide








Le #11858281
merci patrice pour la traduction des 2 requetes en une
fonctionne sans pb

"Patrice" news:u$
D'une facon générale il est possible de faire :

SELECT .. FROM ...
JOIN (SELECT ... FROM ...) AS m ON m.Champ=AutreChamp
etc...

Donc ici qq chose comme :

-- Récupérer les données
SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF
-- qui correspondent à la dernière date par TAART
INNER JOIN
(SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART)

(non testé).

Pour la rapidité voir aussi si les index sont en place...


merci gilles la requete fonctionne
le traitement est malheureusement tres tres long (il y a 42000 enr au
debut et 22000 apres traitement)
peut on faire mieux ?

j'ai essayé mais sans succes sauf en traitant en 2 temps passant par une
premiere requete codeetmaxdate

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART;

puis par une seconde utilisant la premiere

SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF INNER JOIN codeetmaxdate ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART);

c'est pas tres "beau" mais ca va beaucoup + vite
ne peut on pas compiler les 2 requetes en une seule


"Gilles LE BARBIER" message de news:e1Ysjm$
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete
suivante sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il
me faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand
meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide












Le #11858211
j'ai bien avancé avec vos conseils, il me reste cependant encore 1 pb
j'interroge 3 tables situées sur le serveur AS400 via le prog que je
developpe en VB6
et avec la commande LEFT JOINT, (pour ne perdre aucun enregistrements), j'ai
un plantage au niveau de la req1
qui disparait si j'utilise JOINT ou INNER JOIN .Est ce un pb de commande non
geree par le VB6 ou l'AS400 ou alors une histoire de syntaxe ?
si jamais vous savez .......

req1 = "SELECT
TARIF.TAART,TARIF.TADATE,TARIF.TAPRR,TARIF.TAPRX1,TARIF.TAPRX2,TARIF.TAPRX3,TARIF.TAPRX4,ARTIC.ARAPPE,ARTIC.ARCODB,ARTIC.ARLIB,ARTIC.ARLIBC,ARTIC.ARCONV,
ARTIC.ARUF,ARFO.AFFOU,ARFO.AFREF FROM((TARIF INNER JOIN (SELECT
TARIF.TAART,Max(TARIF.TADATE) AS MaxDeTADATE FROM TARIF GROUP BY
TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE = CodeETMAXDATE.MaxDeTADATE)
AND (TARIF.TAART = CodeETMAXDATE.TAART)) LEFT JOIN ARTIC ON TARIF.TAART =
ARTIC.ARART) JOIN ARFO ON TARIF.TAART = ARFO.AFART "

mon prog :
Set base = CreateDatabase(fic, dbLangGeneral)
Che = "Provider=IBMDA400.DataSource.1;" _
& "Persist Security Infoúlse;" _
& "Data Source2.168.0.1;" _
& "Default Collection=" & L & ";" _
& "Catalog Library List=" & L & ""
Set Con = New ADODB.Connection
Con.Open (Che)
Set Ars = New ADODB.Recordset
Ars.CursorType = adOpenDynamic
Ars.LockType = adLockReadOnly
Ars.Open req1, Con, adOpenDynamic, adLockReadOnly, -1 ... ICI EST L
ERREUR A CAUSE DU LEFT DANS REQ1
Set Table = base.CreateTableDef("ARTIC")
With Table
For i = 0 To -1 + Ars.Fields.Count
.Fields.Append .CreateField(Ars.Fields(i).Name, dbText)
Next i
End With
base.TableDefs.Append Table
Set enr = base.OpenRecordset("ARTIC")
Ars.MoveFirst
While Not Ars.EOF
enr.AddNew
For i = 0 To -1 + Ars.Fields.Count
If IsNull(Ars.Fields(i).Value) = False Then
If Trim(Ars.Fields(i).Value) <> "" Then enr.Fields(i).Value =
Trim(Ars.Fields(i).Value)
End If
Next i
enr.Update
Ars.MoveNext
Wend
Ars.Close
Con.Close
Set Ars = Nothing
Set enr = Nothing
fin:
base.Close
Set base = Nothing


End With
End Sub

"Patrice" news:u$
D'une facon générale il est possible de faire :

SELECT .. FROM ...
JOIN (SELECT ... FROM ...) AS m ON m.Champ=AutreChamp
etc...

Donc ici qq chose comme :

-- Récupérer les données
SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF
-- qui correspondent à la dernière date par TAART
INNER JOIN
(SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART)

(non testé).

Pour la rapidité voir aussi si les index sont en place...


merci gilles la requete fonctionne
le traitement est malheureusement tres tres long (il y a 42000 enr au
debut et 22000 apres traitement)
peut on faire mieux ?

j'ai essayé mais sans succes sauf en traitant en 2 temps passant par une
premiere requete codeetmaxdate

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART;

puis par une seconde utilisant la premiere

SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF INNER JOIN codeetmaxdate ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART);

c'est pas tres "beau" mais ca va beaucoup + vite
ne peut on pas compiler les 2 requetes en une seule


"Gilles LE BARBIER" message de news:e1Ysjm$
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete
suivante sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1 il
me faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne quand
meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide












Fred BROUARD
Le #11858161
a écrit :
j'ai bien avancé avec vos conseils, il me reste cependant encore 1 pb
j'interroge 3 tables situées sur le serveur AS400 via le prog que je
developpe en VB6
et avec la commande LEFT JOINT, (pour ne perdre aucun enregistrements),
j'ai un plantage au niveau de la req1
qui disparait si j'utilise JOINT ou INNER JOIN .Est ce un pb de commande
non geree par le VB6 ou l'AS400 ou alors une histoire de syntaxe ?



je crois que DB 400 ne supporte par l'OUTER JOIN...

A +

si jamais vous savez .......

req1 = "SELECT
TARIF.TAART,TARIF.TADATE,TARIF.TAPRR,TARIF.TAPRX1,TARIF.TAPRX2,TARIF.TAPRX3,TARIF.TAPRX4,ARTIC.ARAPPE,ARTIC.ARCODB,ARTIC.ARLIB,ARTIC.ARLIBC,ARTIC.ARCONV,
ARTIC.ARUF,ARFO.AFFOU,ARFO.AFREF FROM((TARIF INNER JOIN (SELECT
TARIF.TAART,Max(TARIF.TADATE) AS MaxDeTADATE FROM TARIF GROUP BY
TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE =
CodeETMAXDATE.MaxDeTADATE) AND (TARIF.TAART = CodeETMAXDATE.TAART)) LEFT
JOIN ARTIC ON TARIF.TAART = ARTIC.ARART) JOIN ARFO ON TARIF.TAART =
ARFO.AFART "

mon prog :
Set base = CreateDatabase(fic, dbLangGeneral)
Che = "Provider=IBMDA400.DataSource.1;" _
& "Persist Security Infoúlse;" _
& "Data Source2.168.0.1;" _
& "Default Collection=" & L & ";" _
& "Catalog Library List=" & L & ""
Set Con = New ADODB.Connection
Con.Open (Che)
Set Ars = New ADODB.Recordset
Ars.CursorType = adOpenDynamic
Ars.LockType = adLockReadOnly
Ars.Open req1, Con, adOpenDynamic, adLockReadOnly, -1 ... ICI EST L
ERREUR A CAUSE DU LEFT DANS REQ1
Set Table = base.CreateTableDef("ARTIC")
With Table
For i = 0 To -1 + Ars.Fields.Count
.Fields.Append .CreateField(Ars.Fields(i).Name, dbText)
Next i
End With
base.TableDefs.Append Table
Set enr = base.OpenRecordset("ARTIC")
Ars.MoveFirst
While Not Ars.EOF
enr.AddNew
For i = 0 To -1 + Ars.Fields.Count
If IsNull(Ars.Fields(i).Value) = False Then
If Trim(Ars.Fields(i).Value) <> "" Then enr.Fields(i).Value =
Trim(Ars.Fields(i).Value)
End If
Next i
enr.Update
Ars.MoveNext
Wend
Ars.Close
Con.Close
Set Ars = Nothing
Set enr = Nothing
fin:
base.Close
Set base = Nothing


End With
End Sub

"Patrice" news:u$
D'une facon générale il est possible de faire :

SELECT .. FROM ...
JOIN (SELECT ... FROM ...) AS m ON m.Champ=AutreChamp
etc...

Donc ici qq chose comme :

-- Récupérer les données
SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF
-- qui correspondent à la dernière date par TAART
INNER JOIN
(SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART) AS CodeETMAXDATE ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART)

(non testé).

Pour la rapidité voir aussi si les index sont en place...


merci gilles la requete fonctionne
le traitement est malheureusement tres tres long (il y a 42000 enr au
debut et 22000 apres traitement)
peut on faire mieux ?

j'ai essayé mais sans succes sauf en traitant en 2 temps passant par
une premiere requete codeetmaxdate

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE
FROM TARIF
GROUP BY TARIF.TAART
ORDER BY TARIF.TAART;

puis par une seconde utilisant la premiere

SELECT TARIF.TAART, TARIF.TAPRX1
FROM TARIF INNER JOIN codeetmaxdate ON (TARIF.TADATE =
codeetmaxdate.MaxDeTADATE) AND (TARIF.TAART = codeetmaxdate.TAART);

c'est pas tres "beau" mais ca va beaucoup + vite
ne peut on pas compiler les 2 requetes en une seule


"Gilles LE BARBIER" dans le message de news:e1Ysjm$
Salut

cette requête devrait faire l'affaire

SELECT TAART, TADATE, TAPRX1
FROM Tarif AS T1
WHERE (TADATE IN
(SELECT MAX(TADATE) AS Expr1
FROM Tarif
WHERE (TAART = T1.TAART)))
A bientot

Gilles


a écrit :
bonjour à tous

novice en la matiere, je ne parviens pas à effectuer la requete
suivante sauf si je le fais en 2 temps
est il possible de le faire en une fois ?



dans TARIF il y a 3 champs TAART(le code article), TADATE et TAPRX1
il me faut le PRIX qui correspond à Max(TADATE)

en executant ce qui suis ca ne fonctionne pas, le resultat donne
quand meme tous les prix

SELECT TARIF.TAART, Max(TARIF.TADATE) AS MaxDeTADATE, TARIF.TAPRX1
FROM TARIF
GROUP BY TARIF.TAART, TARIF.TAPRX1;

merci de votre aide

















--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Publicité
Poster une réponse
Anonyme