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 :

Amélioration d'une requête


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut Amélioration d'une requête
    Bonjour à tous,

    J'ai une requête fonctionnel sur un Etat que j'ai réalisé sous WebDev.
    Mon problème étant qu'elle n'est pas optimisé en terme d'affichage de résultat.

    Voici 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SELECT ANEX.ANEX_NOM,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Lundi} THEN ANEX_NOM END) AS NOM1,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Lundi} THEN QUANTITE END) AS QUANT1,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Lundi} THEN ANEX_UNIT END) AS UNIT1,
     
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mardi} THEN ANEX_NOM END) AS NOM2,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mardi} THEN QUANTITE END) AS QUANT2,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mardi} THEN ANEX_UNIT END) AS UNIT2,
     
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mercredi} THEN ANEX_NOM END) AS NOM3,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mercredi} THEN QUANTITE END) AS QUANT3,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Mercredi} THEN ANEX_UNIT END) AS UNIT3,
     
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Jeudi} THEN ANEX_NOM END) AS NOM4,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Jeudi} THEN QUANTITE END) AS QUANT4,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Jeudi} THEN ANEX_UNIT END) AS UNIT4,
     
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Vendredi} THEN ANEX_NOM END) AS NOM5,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Vendredi} THEN QUANTITE END) AS QUANT5,
    MAX(CASE WHEN ANEXCOM.DATE = {Param_Date_Vendredi} THEN ANEX_UNIT END) AS UNIT5
    FROM 
    ANEX, ANEXCOM
    WHERE
    ANEX.ANEX_CLE = ANEXCOM.ANEX_CLE
    AND
    ANEXCOM.ECOLE_CLE = {Param_Ecole_Cle}
    AND
    ANEXCOM.DATE BETWEEN  {Param_Date_Lundi} AND  {Param_Date_Vendredi}
    GROUP BY 
    ANEX.ANEX_NOM
    Voici le rendu qui est à peu de chose près mon état, puisque la seule différence est que je n'affiche pas la colonne de gauche qui me sert pour le GROUP BY:



    Comme vous pouvez le voir, la 1er ligne ce retrouve en grande parti vide et j'ai pas mal de trou un peu partout.
    J'aimerais gagner de la place si cela est possible. Mais j'ai un doute.

    Enfin si vous voyez une solution.
    Je reste disponible pour des questions si besoin.

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    si vous ne savez pas ce que vous voullez comme résultat on ne va pas pouvoir vous orienter.

    Vous avez réalisé un pivot et c'est la bonne méthode.

  3. #3
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Je souhaiterais gagner de la place, sur l'image on peut voir que le résultat, en le mettant directement dans un tableau, va donné un nombre de case vide assez important.
    Ce que je demande c'est, est il possible de faire une requête qui ne prendrai pas en compte les retour NULL?
    Là je suis ennuyé par mon GROUP BY, j'ai obligatoirement une ligne par "NOM".

    NOM1, QUANT1 et UNIT1 corresponde au lundi, mais si le lundi j'ai qu'un seul retour, et le mardi 20, on va avoir 19 résultats NULL pour le lundi, donc 19 lignes vides.
    C'est ça que je voudrais esquivé. Ça donne un tableau avec beaucoup d'espace n’importe où, ça fait pas propre.

    J'espère être plus clair.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 870
    Points
    12 870
    Par défaut
    Bonjour,
    La ligne ne sera pas vide, puisque tu auras des données pour le mardi, le mercredi.
    Bref je ne vois pas ce qui cloche dans le tableau.

    Tatayo.

  5. #5
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Voici un exemple avec l'état correspondant qui est je pense plus explicite:



    Ici on voit bien que comme c'est trié dans l'ordre du Nom, on ce retrouve avec des espaces n'importe où. Si tout pouvait être regroupé vers le haut, ça ferrait moins bordélique et ça prendrait moins de place.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 870
    Points
    12 870
    Par défaut
    Sauf que dans ce tableau, il manque juste la colonne de gauche (AMEX_NOM), qui elle (d'après le premier exemple) est différent pour chaque ligne...
    Donc si tu "regroupes" les lignes pour supprimer les blanc, ton tableau devient faux, sauf à répéter la colonne AMEX_NOM pour chaque jour.
    Ou alors je n'ai toujours pas compris, et dans ce cas le mieux à faire est de nous donner un tableau (fait à la main dans Excel LibreOffice par exemple) de ce que tu veux (avec toutes les colonnes).

    Tatayo.

  7. #7
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Non, tu as bien compris je pense.
    Dans l'état il y a bien la colonne tout à gauche en moins, le GROUP BY.
    Si je l'enlève, comme tu dis, le résultat est faux. J'ai qu'une ligne, avec un cumul des quantités...


    Je voudrais ça:



    C'est un peu dégueulasse, fait sous paint vite fait.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Quelle regle de gestion pour arriver a ce resultat ?
    On manipule des données avec du sql pas des cases vides / pleine

  9. #9
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Le MCD de la partie concernée:


  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    J'ai du mal à comprendre

    le problème est dans le résultat de la requête, ou dans son affichage avec, justement, le non-affichage des NULLs ?
    Si c'est cela pourquoi ne pas utiliser COALESCE ?

  11. #11
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Le résultat est entres guillemets bon, j'ai bien un classement par colonne de chaque Nom,Quantite et unite cela par jour en gros que j'envoi à la requête (du lundi au vendredi d'une semaine).
    Le problème, c'est que ça rend mal vu que ça fait une ligne par Nom.
    Faudrait un résultat par colonne pour chaque jour (comme actuellement), mais avec un Nom qui peut être différent pour la même ligne(pas comme maintenant).

    Je n'ai jamais utilisé COALESCE, je vais voir ça.

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    marchera pas le coalesce.

    Je penses qu'un traitement côté applicatif serai plus simple et plus propre.


    Sinon amusez-vous avec des fontions de fenetrage (pour ranker chaque colonne) + requete recursive (pour reconstrurie le resultat via le ranking colonne par colonne) ca pourrai marcher.

  13. #13
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Je vois, je vais voir ça dans le code.
    Je voulais savoir si il y avait une possibilité assez simple coté SQL. Ça ne semble pas être le cas.
    Merci pour votre aide.

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    SQL étant un langage complet, tout problème peut être traité avec une seule requête, a condition que le problème soit bien posé ! Ceci suppose que vous ayez les bonnes données au départ. Or ce n'est pas kle cas car si vous n'avez pas une table de date, votre base ne saura pas inventer des données qui ne sont pas dans la base.
    donc :
    1) créer une table de Dates
    2) faire un produit cartésien de cette table avec vos données,
    3) prévoir une sous requête corrélée pour remplir chaque "case" du produit cartésien.

    A +

Discussions similaires

  1. [2012] Aide à l'amélioration d'une requête
    Par MRzaa dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2014, 12h08
  2. Amélioration d'une requête
    Par Redg9 dans le forum Requêtes
    Réponses: 8
    Dernier message: 29/07/2009, 11h18
  3. cherche aide pour améliorer le traitement d'une requête
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/04/2008, 14h15
  4. Amélioration d'une requête
    Par phtpht dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/07/2006, 12h20
  5. améliorer une requête
    Par papilou86 dans le forum Access
    Réponses: 5
    Dernier message: 22/05/2006, 11h40

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