DISTINCT à partir d'une jointure [Résolu/Fermé]

Signaler
Messages postés
4264
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
-
Messages postés
48680
Date d'inscription
mardi 2 février 2010
Statut
Modérateur
Dernière intervention
13 octobre 2020
-
Salut,

Je travaille sous SQL Server pour mettre en place et je galère depuis hier avec une requête. J'ai deux tables et à partir de celle-ci, je fais une jointure et de cette jointure, je veux juste les résultats où les dates sont uniques (ça se fait normalement avec un DISTINCT). Je poste mes tables pour vous montrer et les requêtes:

Table jeux
Table PRevient

Requête de la jointure:
SELECT u.code,
	     u.console,
	     u.dateVente, 
	     u.nom,
	     u.possesseur,
	     u.dateEntree,
	     MAX(u.[dateVente]) AS dateprix 
FROM   (SELECT tj.code, 
               tj.dateVente,
               tj.console,
               tj.possesseur,
               tj.prixVente, 
               tv.[dateEntree] ,
               tv.prixRevient,
               tj.nom
        FROM   jeux AS tj 
               INNER JOIN PRevient AS tv 
                 ON ( tv.[dateEntree] <= tj.[dateVente] ) 
                    AND ( tj.[code] = tv.[codeGame] )) AS u 
GROUP  BY u.code, 
          u.dateVente,
          u.console,
          u.nom,
          u.possesseur,
          u.dateEntree;


Le résultat de la jointure

Ce que je voudrais, c'est à partir de la table jointure avoir juste les lignes où les "dateVente" sont différentes et qu'elles soit les maximums.

En enlevant "u.dateEntree" du premier SELECT et du "GROUP BY", je l'ai mais je n'ai pas les autres champs, ce que je veux c'est avoir tous les champs comme sur la capture (jointure) mais seulement avec les dates (datePrix) différentes.

Merci de votre attention.

4 réponses

Messages postés
1041
Date d'inscription
lundi 4 mai 2009
Statut
Webmaster
Dernière intervention
21 avril 2020
60
Salut,

Sacrée requête :)

Pour être sûr de bien comprendre, dans ton exemple, tu ne veux QUE la ligne "2013-06-10" parce que cette date est unique, ou tu veux TOUTES les dates mais avec une seule ligne pour chaque ?

Si c'est ce 2ème cas, et que tu ne veux QUE les datePrix différents, il va falloir indiquer une fonction de groupement sur les autres colonnes ... car sinon, pour la date 2013-06-25, SQL ne saura pas lequel des 6 enregistrements tu veux ?
(MAX, MIN, ...) :
SELECT MAX(code), MAX(console), MAX(dateVente), ... , datePrix
FROM (<ta requête ici>)
GROUP BY datePrix
 


Dis moi :)
Messages postés
48680
Date d'inscription
mardi 2 février 2010
Statut
Modérateur
Dernière intervention
13 octobre 2020
84
Bonjour Bionik fiston et ami,

T'as de la veine ou il y a quelqu'un la haut qui t'aime ! Tu reçois de l'aide de Damien, le top des tops, l'éminence en la matière !

Bonne journée
Messages postés
1041
Date d'inscription
lundi 4 mai 2009
Statut
Webmaster
Dernière intervention
21 avril 2020
60
Moqueur va ... ^^ non mais sans déc c'est pas souvent qu'il y a des requêtes aussi rigolotes et bien étayées ... si j'avais le temps je me monterais la même structure pour tester :D
Messages postés
4264
Date d'inscription
jeudi 19 août 2010
Statut
Modérateur
Dernière intervention
3 août 2016
163
Merci ô Sir Dam,

Un bon café, et quelques minutes (ok, quelques heures) de réflexion ont suffit pour résoudre le problème.

En fait, j'avais juste fait une modélisation "on-the-fly" de ma base, j'avais pas bien pris le temps de bien faire les choses. Sur ce, je suis reparti de zéro et j'ai refait la modélisation qui me donne trois tables, une pour jeux, une autre pour ventes et une dernière pour pRevient.

Voici ces tables:
table jeux
table ventes
table pRevient

Et le résultat que je voulais
Table Finale

Pour la requête qui donne cette dernière, c'est un peu ça:

SELECT jeux.nom,
       jeux.possesseur,
       r.dateVente,
       r.prixVente,
       r.prixRevient,
       r.Marges
FROM jeux
INNER JOIN
  (SELECT ventes.idJeux,
          ventes.dateVente,
          ventes.prixVente,
          [pRevient].prixRevient, [ventes].[PrixVente]-[pRevient].[PrixRevient] AS Marges
   FROM (ventes
         INNER JOIN
           (SELECT u.idJeux,
                   u.dateVente,
                   MAX(u.dateReception) AS dateMax
            FROM
              (SELECT ventes.idJeux,
                      ventes.dateVente,
                      pRevient.dateReception
               FROM ventes
               INNER JOIN pRevient ON ventes.idJeux = pRevient.idJeux
               WHERE pRevient.dateReception <= ventes.dateVente) AS u
            GROUP BY u.idJeux,
                     u.dateVente) AS v ON ventes.dateVente = v.dateVente)
   INNER JOIN [pRevient] ON (v.idJeux = [pRevient]. idJeux) AND (v.dateMax = [pRevient].dateReception)
GROUP BY ventes.idJeux,
         ventes.dateVente,
         ventes.prixVente,
         [pRevient].prixRevient, [ventes].[PrixVente]-[pRevient].[PrixRevient] ) AS r ON r.idJeux = jeux.idJeux ;

Alors, c'est toujours aussi rigolote? :)

Mais ca, c'est juste un test et ça va beaucoup m'aider sur le système réél (mis en place d'une application "machin-truc" utilisant une base de données SQL Server, Accès, Excel, Sharepoint, PowerPivot et sans oublier PHP pour la partie programmation, déjà que j'avais galéré pour trouver le bon driver SQLServer-PHP, c'est bien parti ;).

Merci anyway de ton aide Dam ;)

PS: Ave Ambucias, je te charge de la partie Accès et Excel, ze ve voir ce ke ta dan le ventre :)
Messages postés
48680
Date d'inscription
mardi 2 février 2010
Statut
Modérateur
Dernière intervention
13 octobre 2020
84
@Bionik, Merci pour ton inébranlable confiance dans mes talents, mais, justement j'ai le ventre vide Pour la partie Excel, mon Ange, voire Fanny, pourraient s'en charger mais elles ne sont pas membres. Dommage ! (Tu as pensé à rizvisa1 ou à TrowanD ?)

@Damien, on sait bien que la modestie est le genre de fierté qui blesse le moins,