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

Langage SQL Discussion :

À vos neurones


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut À vos neurones
    Bonjour,

    J'ai besoin de récupérer dans une table de consommation les derniers articles pour un client donné sur une période donnée.
    J'arrive à réaliser la première requête de sélection ci dessous qui fonctionne correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
      VBRP_VRPMA.MATNR AS MATNR,  
      MAX(VBRP_VRPMA.FKDAT) AS le_maximum_FKDAT
    FROM 
      VBRP_VRPMA
    WHERE 
      VBRP_VRPMA.MANDT = '400'
      AND  VBRP_VRPMA.KUNNR = '0000005696'
      AND  VBRP_VRPMA.FKDAT BETWEEN '20110101' AND '20111231'
    GROUP BY 
      VBRP_VRPMA.MATNR
    par contre, je souhaite également récupérer sur cette même table d'autres rubriques comme le libellé texte, le dernier prix pratiqué etc,... et logiquement dès que j'intègre à ma requête précédente les dites rubriques cela ne fonctionne plus.
    Je pense à une requête imbriquée mais comment faire la liaison et surtout le temps de réponse sera-t-il correct ?

    Qu'en pensez-vous, avez vous des pistes ?

    Merci pour vos retours,

    RB

  2. #2
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Si vous ne souhaitez pas grouper votre max sur les autres colonnes, cela s'appelle un produit cartésien et c'est très consommateur... De plus, ça n'a pas vraiment de sens, il faut faire plusieurs requêtes...

    Si vous souhaitez grouper avec les autres critères, il suffit de le mettre dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    VBRP_VRPMA.MATNR AS MATNR, 
    MAX(VBRP_VRPMA.FKDAT) AS le_maximum_FKDAT,
    autres colonnes
    FROM 
    VBRP_VRPMA
    WHERE 
    VBRP_VRPMA.MANDT = '400'
    AND VBRP_VRPMA.KUNNR = '0000005696'
    AND VBRP_VRPMA.FKDAT BETWEEN '20110101' AND '20111231'
    GROUP BY 
    VBRP_VRPMA.MATNR, autres colonnes

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Sans la description de vos tables sous forme DDL et surtout ce que veulent dire vos colonnes aux noms abscons il est difficile de vous aider d'avantage.

    Merci de vous conformer à la charte de postage : http://www.developpez.net/forums/a69...gage-sql-lire/

    A +

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Correction
    Je vous prie de m'excuser mais je débute sur ce forum.
    Code plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
      idClient AS idClient,  
      MAX(dateAchat) AS le_maximum_dateAchat
    FROM 
      nomTable
    WHERE 
      idEnvironnement = '400'
      AND  idArticle = '0000005696'
      AND  dateAchat BETWEEN '20110101' AND '20111231'
    GROUP BY 
      idClient
    Merci pour ton retour Arkhena, effectivement le produit cartesien moyen.
    Je cherche une solution plus compacte sur une seule requête, en évitant plusieurs requêtes si possible, un double select peut être ?

    Je sens que je vais passer le week end la dessus

    Merci

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Vous ne pourrez pas échapper à la sous requête. Soit en joignant sur le MAX soit en utilisant une fonction de fenêtrage...
    --> solution 1 : jointure avec MAX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T.* 
    FROM   nomTable AS T
           INNER JOIN  (SELECT idClient, MAX(dateAchat) AS MAX_dateAchat
                        FROM   nomTable
                        WHERE  idEnvironnement = '400'
                          AND  idArticle = '0000005696'
                          AND  dateAchat BETWEEN '20110101' AND '20111231'
                        GROUP BY idClient) AS T2
                  ON T.idClient = T2.idClient
                     AND T.dateAchat = T2.MAX_dateAchat
    --> solution 1 : fonction de fenêtrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH T AS (                 
    SELECT *, RANK() OVER(PARTITION BY idClient ORDER BY dateAchat DESC) AS N
    FROM   nomTable
    WHERE  idEnvironnement = '400'
    AND    idArticle = '0000005696'
    AND    dateAchat BETWEEN '20110101' AND '20111231')
    SELECT *
    FROM   T
    WHERE  N = 1;
    Et pour un cours sur le langage SQL, mon site comme mon bouquin, peuvent vous être utile !!!

    Notamment :
    Sous Requêtes : http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/
    Fonction de fenêtrage : http://sqlpro.developpez.com/article...clause-window/
    CTE : http://sqlpro.developpez.com/cours/s...te-recursives/

    A +

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Episode 2
    Bonsoir,

    J'ai testé l'option avec la jointure, j'étais un peu dans cet axe mais en plus léger.

    Si je la teste intégralement l'interpréteur me retourne une erreur de table T2 inconnue.

    J'ai donc testé la requête imbriquée (le 2° select entre parenthèse, qui est à mon niveau de sql) qui fonctionne correctement entre 7 et 10 s (1, 5 millions d'enregistrements dans la table).

    Sans doute une erreur de syntaxe mais que je ne la trouve pas.

    En tout cas chapeau, c'est intéressant.

    (je vais prendre tes chapitres pour ce week end)

    Qu'en penses-tu ?

    Merci,

    RB

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 061
    Points
    53 061
    Billets dans le blog
    6
    Par défaut
    Commencez par vous conformer à la charte de postage :
    http://www.developpez.net/forums/a69...gage-sql-lire/
    en nous donnant au minimum le nom et la version de votre SGBDR.
    Ce serait évidemment beaucou plus intéressant si vous nous donniez le DDL de vos table, un jeu d'essais sous forme INSERT et le résultat attendu

    Certains pseudo SGBDR comme MySQL (à lire) n'ont implémenté que très peu de chose du langage SQL...

    A +

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Suite
    Bonjour,

    Il s'agit d'une base de données sql serveur 2005.
    Pour le reste je ne peux pas.

    Merci,

    RB

Discussions similaires

  1. Faites marcher vos neurones !
    Par Aspic dans le forum Enigmes
    Réponses: 11
    Dernier message: 07/12/2014, 17h07

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