DISTINCT à partir d'une jointure

Résolu/Fermé
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 - 10 avril 2013 à 14:08
Ambucias Messages postés 47356 Date d'inscription mardi 2 février 2010 Statut Modérateur Dernière intervention 15 février 2023 - 11 avril 2013 à 23:19
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

dam75 Messages postés 1043 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
11 avril 2013 à 10:49
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 :)
0
Ambucias Messages postés 47356 Date d'inscription mardi 2 février 2010 Statut Modérateur Dernière intervention 15 février 2023 137
11 avril 2013 à 11:51
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
0
dam75 Messages postés 1043 Date d'inscription lundi 4 mai 2009 Statut Webmaster Dernière intervention 21 février 2023 67
11 avril 2013 à 12:21
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
0
Bionik Messages postés 4234 Date d'inscription jeudi 19 août 2010 Statut Modérateur Dernière intervention 3 août 2016 183
11 avril 2013 à 14:23
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 :)
0
Ambucias Messages postés 47356 Date d'inscription mardi 2 février 2010 Statut Modérateur Dernière intervention 15 février 2023 137
11 avril 2013 à 23:19
@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,
0