Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

requete

6 réponses
Avatar
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

6 réponses

Avatar
Gilles LE BARBIER
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



Avatar
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" a écrit 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





Avatar
Patrice
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...

a écrit dans le message de news:

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" a écrit 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








Avatar
merci patrice pour la traduction des 2 requetes en une
fonctionne sans pb

"Patrice" <http://www.chez.com/scribe/&gt; a écrit dans le message de
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...

a écrit dans le message de news:

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" a écrit 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












Avatar
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" <http://www.chez.com/scribe/&gt; a écrit dans le message de
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...

a écrit dans le message de news:

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" a écrit 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












Avatar
Fred BROUARD
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" <http://www.chez.com/scribe/&gt; a écrit dans le message de
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...

a écrit dans le message de news:

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" a écrit
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 ***********************