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 :

requête sur le rendement d'un dossier


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut requête sur le rendement d'un dossier
    Bonjour,

    J'ai un peu de difficulté pour la réalisation d'une requête dont voici le début:
    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
    SELECT 
        Client.Nom_Client AS Nom_Client,    
        Dossier.Date_Création_Dossier AS Date_Création_Dossier,    
        Dossier.IDDossier AS IDDossier,    
        Dossier.HTVA_Dossier AS HTVA_Dossier
    FROM 
        Client,    
        Dossier
    WHERE 
            Dossier.IDClient    =    Client.IDClient
        AND
        (
            Client.Nom_Client = {nom}
            AND    Dossier.Date_Création_Dossier BETWEEN {date_debut} AND {date_fin}
            AND    Dossier.IDFacture <> 0
        )
    Je doit rajouter le rendement à cette requête. Le rendement c'est le total du dossier - se que l'on donne à un sous traitant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.htva_dossier - soustraitant_dossier.total_htva_dossier
    Avec comme clé de jointure iddossier.
    Mais le problème c'est qu'un dossier n'a pas forcément de sous traitance et qu'il peut en avoir plusieurs, et c'est là où je bloque, je ne sais pas comment ajouter ce paramètre. Pouvez-vous m'aider?
    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est là qu'il faut apprendre la syntaxe normalisée depuis 1992 pour les jointures et utilisée une jointure externe !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c.Nom_Client,    
      d.Date_Création_Dossier, d.IDDossier, d.HTVA_Dossier,
      d.htva_dossier - s.total_htva_dossier AS Rendement
    FROM Client AS c
    INNER JOIN Dossier AS d ON d.IDClient = c.IDClient
      LEFT OUTER JOIN soustraitant_dossier AS s ON s.IDDossier = d.IDDossier
    WHERE c.Nom_Client = {nom}
      AND d.Date_Création_Dossier BETWEEN {date_debut} AND {date_fin}
      AND d.IDFacture <> 0
    Remarques :
    1) Pourquoi faire des alias de colonnes avec le même nom que la colonne ?
    Le seul alias utile dans le SELECT est celui du calcul du rendement.

    2) Je préfère utiliser les alias de tables, ça allège la lecture de la requête.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    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,

    Je penses Cinephil que tu as omis ceci :
    Mais le problème c'est qu'un dossier n'a pas forcément de sous traitance et qu'il peut en avoir plusieurs
    Du coup il faudrait plutôt passer par une sous requête dans le left outer join non ?
    de ce styl :

    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
     
    SELECT 
    	Client.Nom_Client AS Nom_Client,	
    	Dossier.Date_Création_Dossier AS Date_Création_Dossier,	
    	Dossier.IDDossier AS IDDossier,	
    	Dossier.HTVA_Dossier AS HTVA_Dossier
    	Dossier.HTVA_Dossier - COALESCE(total_htva_dossier, 0) as rendement
    FROM 	Client	
    INNER JOIN	Dossier on Dossier.IDClient = Client.IDClient
    LEFT OUTER JOIN (SELECT iddossier, sum(htva_dossier) as total_htva_dossier FROM 
    soustraitant_dossier group by iddossier) as tmp on tmp.iddossier = Dossier.iddossier
    WHERE 
    	(
    		Client.Nom_Client = {nom}
    		AND	Dossier.Date_Création_Dossier BETWEEN {date_debut} AND {date_fin}
    		AND	Dossier.IDFacture <> 0
    	)
    edit: mauvaise syntaxe

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses rapide!
    Malheureusement aucune de vos requêtes ne me retourne de résultat.
    En suivant vos idées j'ai fait cette 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
    	Client.Nom_Client,
    	Dossier.IDDossier,	
    	Dossier.HTVA_Dossier,
    	Dossier.HTVA_Dossier-COALESCE(total, 0)
    FROM
    	Client,
    	Dossier
    	LEFT OUTER JOIN (SELECT IDDossier, SUM(htva_dossier) AS total FROM Soustraitant_dossier GROUP BY IDDossier) AS tmp ON tmp.IDDossier = Dossier.IDDossier
    WHERE
    		Client.IDClient = Dossier.IDClient
    	AND Client.Nom_Client = {client}
    Avec celle-la j'obtiens les bon résultats, seulement dés que je rajoute des contraintes de période dans le where de fin, je n'obtiens plus réponse, je ne comprend pas pourquoi..

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et avec la bonne syntaxe pour la jointure interne ?
    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
    SELECT
        Client.Nom_Client,
        Dossier.IDDossier,    
        Dossier.HTVA_Dossier,
        Dossier.HTVA_Dossier-COALESCE(total, 0)
    FROM
        Client
        INNER JOIN Dossier ON Client.IDClient = Dossier.IDClient
          LEFT OUTER JOIN (
            SELECT IDDossier, SUM(htva_dossier) AS total 
            FROM Soustraitant_dossier GROUP BY IDDossier
          ) AS tmp ON tmp.IDDossier = Dossier.IDDossier
    WHERE
        Client.Nom_Client = {client}
        AND Dossier.Date_Création_Dossier BETWEEN {date_debut} AND {date_fin}
        AND Dossier.IDFacture <> 0
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et avec la bonne syntaxe pour la jointure interne ?
    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
    SELECT
        Client.Nom_Client,
        Dossier.IDDossier,    
        Dossier.HTVA_Dossier,
        Dossier.HTVA_Dossier-COALESCE(total, 0)
    FROM
        Client
        INNER JOIN Dossier ON Client.IDClient = Dossier.IDClient
          LEFT OUTER JOIN (
            SELECT IDDossier, SUM(htva_dossier) AS total 
            FROM Soustraitant_dossier GROUP BY IDDossier
          ) AS tmp ON tmp.IDDossier = Dossier.IDDossier
    WHERE
        Client.Nom_Client = {client}
        AND Dossier.Date_Création_Dossier BETWEEN {date_debut} AND {date_fin}
        AND Dossier.IDFacture <> 0
    Non, cela fonction avec la jointure interne uniquement si je supprime les clauses dans le WHERE. Comme j'utilise Windev, je me demande si il n'a pas une syntaxe différente...

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Euh... moi pas comprendre !
    Citation Envoyé par DGuillaume Voir le message
    Non, cela fonction avec la jointure interne uniquement
    Jointure interne = INNER JOIN (norme SQL 1992, il serait peut-être temps de s'y mettre !)
    Comme j'utilise Windev, je me demande si il n'a pas une syntaxe différente...
    C'est peut-être Windev qui n'est pas à la norme alors ?

    Quelle est la requête réellement envoyée par Windev au SGBD ?
    En soumettant la requête que j'ai donnée directement au SGBD (lequel au fait ?), ça donne quoi ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    La requête que vous m'avez transmise ne fonctionne que lorsque je retire les clauses dans le WHERE sinon il ne me renvoie rien.

    Le sgbd que j'utilise est HyperfilsSQL (en client / serveur). Et en soumettant la requête directement au sgbd je n'obtiens aucun résultats.

Discussions similaires

  1. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  2. Requête sur un MemData
    Par claude dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 10h11
  3. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11
  4. Requête sur un serveur lié
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2003, 11h35
  5. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28

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