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

Développement SQL Server Discussion :

plusieurs requêtes dans un tableau SQLSRV 2005


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut plusieurs requêtes dans un tableau SQLSRV 2005
    Bonjour,

    Tout d'abord veuillez m'excuser pour le titre peu explicite mais j'ai du mal à exprimer clairement et surtout de manière synthétique mon besoin.

    Notre solution de gestion s'appuyant sur un SGBD SQL SERVER, Je souhaiterais, via une requête SQL, pouvoir obtenir un tableau du type suivant :

    | NB_Factures | NB FACTURES EN RETARD |
    Janvier | 20 | 5 |
    Février | 12 | 3 |
    Mars | 10 | 2 |
    ... etc

    Je parviens bien à obtenir les résultats NB_Factures et NB FACTURES EN RETARD, pour chacun de ces résultats, je fait un select Count en appliquant une clause restrictive sur le mois ou l'année (Cf. requête ci-après).

    Le problème c'est que je n'obtiens ainsi qu'un seul mois à la fois...

    Je souhaiterais donc savoir comment on peut faire (si c'est possible) pour faire une sorte de "boucle" qui permettrait d'obtenir directement un décomposition mensuelle sur une année...

    Voici une requête type pour l'obtention d'un décompte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select 
    COUNT(*) AS NB_FACTURES_RETARD
    FROM  Fact_Cli F
    LEFT JOIN TRESO T ON T.N_Facture = F.N_Fact_Cli
    LEFT JOIN AFFAIRE A ON A.N_AFFAIRE = F.N_AFFAIRE
    LEFT JOIN DEPOT D ON D.N_DEPOT = A.N_DEPOT
     
    WHERE UPPER(T.PAYER) <> 'OUI'
    AND F.HT_EURO > 0
    AND (D.N_DEPOT = 14 OR D.N_DEPOT = 18 OR D.N_DEPOT = 22)
    merci d'avance pour votre aide.

    CL

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne vois pas de clause restrictive sur le mois ou l'année.
    Je ne vois pas non plus la requête pour le nombre de factures.

    Êtes-vous sûr d'avoir besoin de toutes ces jointures externes ?
    Car vos conditions dans le where les font sauter...

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Après avoir réfléchis à ce qu'a dit Waldar (sinon votre emploie du sql va à la catastrophe) vous pourriez songer à la clause GROUP BY.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Merci pour vos réponses, en effet mon SQL est plutôt désastreux mais j'essaie de m'améliorer, notamment avec ce Forum ;-)

    Waldar, est-ce que tu veux dire que je dois plutôt utiliser une requête du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    COUNT(*) AS NB_FACTURES_RETARD
    FROM Fact_Cli F, TRESO T,AFFAIRE A,DEPOT D 
    WHERE T.N_Facture = F.N_Fact_Cli
    AND A.N_AFFAIRE = F.N_AFFAIRE
    AND D.N_DEPOT = A.N_DEPOT
    AND UPPER(T.PAYER) <> 'OUI'
    AND F.HT_EURO > 0
    AND (D.N_DEPOT = 14 OR D.N_DEPOT = 18 OR D.N_DEPOT = 22)
    Parce que ça me retourne le même résultat ?

    Merci d'avance pour vos réponses
    cl

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je l'aurai écrite ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 
        COUNT(*) AS NB_FACTURES_RETARD
    FROM
        dbo.Fact_Cli AS F
        INNER JOIN dbo.TRESO AS T
          ON T.N_Facture = F.N_Fact_Cli
        INNER JOIN dbo.AFFAIRE AS A
          ON A.N_AFFAIRE = F.N_AFFAIRE
        INNER JOIN dbo.DEPOT AS D
          ON D.N_DEPOT = A.N_DEPOT
    WHERE
        UPPER(T.PAYER) <> 'OUI'
    AND F.HT_EURO > 0
    AND D.N_DEPOT IN (14, 18, 22)
    Vous n'avez pas répondu à mes premières questions, qui sont importantes pour résoudre votre problème !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    De manière générique, voici comment devrait s'écrire votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT YEAR(maDateDeFacture) AS AN,
           MONTH(maDateDeFacture) AS MOIS,
           COUNT(*) AS NB_FACTURES,
           SUM(CASE
                  WHEN maDateDePaiement > MaDateDexigibilité THEN 1
                  ELSE 0
               END) AS NB_FACTURES_EN_RETARD  
    FROM  ...
    WHERE ...
    GROUP BY YEAR(maDateDeFacture), MONTH(maDateDeFacture)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Bonjour,

    Désolé de ne pas avoir répondu précisément à vos questions c'eut été la moindre des choses...

    J'ai en effet besoin des jointures (avec la table treso pour obtenir l'état payé d'une facture, de la table depot pour un filtre par localisation en revanche je me suis aperçu que je pouvais me passer de la table affaire).

    Je peux me contenter de jointure interne car je n'ai à priori pas d'enregistrement "orphelin"

    Enfin, il manquait effectivement la clause restrictive sur la date, que j'appliquais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MONTH(Fact_Cli.Date_Facture) = 01 AND YEAR(Fact_Cli.Date_Facture)=2009
    Je vais tenter d'aborder la syntaxe proposée par SQLpro afin d'être le plus cohérent possible, je me permet de laisser ce post ouvert en cas d'ecueil.

    Merci encore pour vos conseils.

    CL

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Super SQLPro, votre requêteme renvoie bien ce que je veux, voici donc ma syntaxe :

    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 YEAR(F.Date_Facture) AS AN,
           MONTH(F.Date_Facture) AS MOIS,
           COUNT(*) AS NB_FACTURES,
           SUM(CASE
                  WHEN T.Date_Echeance_Visible > T.Date_Echeance_Reelle THEN 1
                  ELSE 0
               END) AS NB_FACTURES_EN_RETARD  
    FROM  Fact_Cli F
    	INNER JOIN TRESO T ON T.N_Facture = F.N_Fact_Cli
    	INNER JOIN AFFAIRE A ON A.N_AFFAIRE = F.N_AFFAIRE
    WHERE 
    	A.N_DEPOT IN (14, 18, 22)
    	AND F.HT_EURO > 0	
    	AND UPPER(F.AVOIR) <> 'OUI'
    GROUP BY YEAR(F.Date_Facture), MONTH(F.Date_Facture)
    ORDER BY YEAR(F.Date_Facture) DESC , MONTH(F.Date_Facture)
    Par contre, je souhaiterais appliquer un critère à la colonne NB_FACTURES_EN_RETARD (en l'occurence où T.PAYER <> 'oui') mais pas à NB_FACTURES. Comment dois-je m'y prendre ? dois-je faire des sous requêtes ou puis-je gérer celà avec un CASE ?

    Merci d'avance

    CL

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Damned !

    Je pensais être arrivé au bout de mes peines mais je m'aperçoit que je me suis fourvoyé...

    Au final, ce qui m'est demandé, ce sont les données suivantes :

    1. Nombre total de factures envoyées sur le mois
    2. Nombre total de factures non réglées (à la date du mois en cours)
    3. Nombre total de factures non réglées à échéances (à la date du mois en cours)

    Soit le tableau suivant :



    et là, franchement je ne vois pas trop comment m'y prendre, car la requête utilisée précédemment donne les résultats pour le mois en cours uniquement.

    Est-ce seulement possible ? Quelles fonctions utiliser ? merci d'avance pour votre aide

    CL

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/01/2012, 21h33
  2. [reporting services] Plusieurs requêtes dans un tableau
    Par ndsaerith dans le forum Administration
    Réponses: 1
    Dernier message: 02/09/2010, 10h25
  3. Réponses: 6
    Dernier message: 18/09/2007, 17h10
  4. [VB]résultat requête dans un tableau
    Par blaiso dans le forum VB 6 et antérieur
    Réponses: 29
    Dernier message: 30/01/2006, 16h26

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