IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

DISTINCT à partir d'une jointure [2008R2]


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut DISTINCT à partir d'une jointure
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    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;
    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.

  2. #2
    Membre actif
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Points : 226
    Points
    226
    Par défaut
    Bonjour,
    la même question a déjà été posée aujourd'hui dans le forum SQL: http://www.developpez.net/forums/d13...duit-max-date/ .

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par KookieMonster Voir le message
    Bonjour,
    la même question a déjà été posée aujourd'hui dans le forum SQL: http://www.developpez.net/forums/d13...duit-max-date/ .
    Salut,

    Désolé mais j'ai appliqué cela mais ce ne fonctionne pas, le principe est effectivement le même mais ça ne marche pas.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Votre BDD semble très mal modélisée, et c'est en partie ce qui vous pose problème aujourd'hui pour écrire votre requête.

    Possesseur et Console devraient être dans des tables séparées. mais surtout les prix de vente pour ce qui vous intéresse aujourd'hui. Il faudrait modifier votre modèle. ça simplifierait ce type de requêtes, et vous auriez de meilleures performances.


    Pouvez vous aussi poster le résultat attendu, car je n'ai pas bien compris ce que vous vouliez obtenir au final

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Ce sont en fait des tables fictives, ça me sert juste à titre d'exemple mais j'aurai quelque chose de beaucoup plus élaboré lors de la modélisation du système.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Est-ce que vous cherchez à obtenir le prix de revient pour chaque vente ?

    Est-ce que ceci vous donne ce que vous voulez ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SELECT 
                   tj.code,  
                   tj.dateVente, 
                   tj.console, 
                   tj.possesseur, 
                   tj.prixVente,  
                   u.dateEntree , 
                   u.prixRevient, 
                   tj.nom 
    FROM   jeux AS tj  
    CROSS APPLY (
                  SELECT TOP(1) dateEntree, PrixRevient 
                  FROM PRevient AS tv  
                  WHERE   tv.[dateEntree] <= tj.[dateVente]   
                      AND   tj.code = tv.[codeGame] 
                  ORDER BY tv.dateEntree DESC
    ) AS u

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Un bon café, et quelques minutes (ok, quelques heures) de réflexion ont suffi 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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    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 ;
    Merci beaucoup aieeeuuuuu, je suis sûr que ta solution va aider d'autres

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction de données à partir d'une "jointure"
    Par fausto dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/11/2012, 11h01
  2. création d'une table a partir d'une jointure
    Par lozeba dans le forum Débuter
    Réponses: 3
    Dernier message: 14/04/2010, 19h21
  3. Faire un UPDATE à partir d'une sélection avec jointure
    Par grping dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/03/2009, 17h06
  4. Réponses: 1
    Dernier message: 23/08/2006, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo