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 :

Requete avec groupement et calcul


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut Requete avec groupement et calcul
    Bonjour a tous

    J'ai ici en dessous une requête ( qui fonctionne presque bien), en effet, je souhaiterais regroupé les articles de même famille'(DocDetail.DocDetailIdFamille)' et en faire le total des quantiés.
    Quelqu'un vois comment je dois m'y prendre et cette requête ( ci-dessous) ,est elle bien écrite

    Merci bien de l'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT Clients.Nom, Clients.IdClient, DocAdmin.TypeDocument, DocAdmin.DateEcheance, DocAdmin.NumeroDocument, DocAdmin.TypeFacturation, 
                                     DocDetail.DocDetailNumeroArticle, DocDetail.DocDetailIdFamille, DocDetail.DocDetailQuantite, DocDetail.DocDetailPrixVente, 
                                     DocDetail.DocDetailDesignation, DocDetail.DocDetailPlu, DocDetail.DocDetailTauxTva, 
                                     DocDetail.DocDetailType FROM Clients INNER JOIN DocAdmin ON Clients.IdClient = DocAdmin.IdClient INNER JOIN 
                                     DocDetail ON DocAdmin.NumeroDocument = DocDetail.NumDocAdmin WHERE (DocAdmin.IdClient = 77) AND (DocAdmin.TypeFacturation = 'M') 
                                     AND (DocAdmin.DateEcheance >='26/01/2011') AND (DocDetail.DocDetailIdFamille =3) AND (DocAdmin.DateEcheance <= '01/02/2011') 
                                     ORDER BY DocAdmin.NumeroDocument

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Non, et déjà ça saute au yeux : aucune indentation => mauvaise lisibilité.

    Pas d'utilisation des alias de tables, pas de préfixe avec les schémas.

    Trop de parenthèses inutiles dans les filtres, utilisation d'un littéral pour comparaison avec une date.

    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
      SELECT cli.Nom,
             cli.IdClient,
             dad.TypeDocument,
             dad.DateEcheance,
             dad.NumeroDocument,
             dad.TypeFacturation, 
             dod.DocDetailNumeroArticle,
             dod.DocDetailIdFamille,
             dod.DocDetailQuantite,
             dod.DocDetailPrixVente, 
             dod.DocDetailDesignation,
             dod.DocDetailPlu,
             dod.DocDetailTauxTva,
             dod.DocDetailType
        FROM dbo.Clients as cli
             INNER JOIN dbo.DocAdmin as dad
               ON dad.IdClient = cli.IdClient
             INNER JOIN dbo.DocDetail as dod
               ON dod.NumDocAdmin = dad.NumeroDocument
       WHERE dad.IdClient = 77
         AND dad.TypeFacturation = 'M'
         AND dad.DateEcheance between {d '2011-01-26'} and {d '2001-02-01'}
         AND dod.DocDetailIdFamille = 3
    ORDER BY dad.NumeroDocument ASC
    Pour votre besoin, vous désirez avoir une colonne avec les quantités ou bien des lignes avec des totaux / sous-totaux ?

  3. #3
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Bonjour,

    Et déjà merci pour cette réponse qui me permes de corrigé la syntaxe de ma requête

    Dans le résultat de cette requête j'ai 8 lignes en retour dont certaine continne des articles identiques, mais sur des numéro de document différent.

    Je souhaiterais effectué un groupage des articles identiques et en faire le total des quantiés et n'avoir qu'une ligne contenant cet article et son total

    merci
    Images attachées Images attachées  

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Je vous laisse chercher un peu en vous indiquant ce tutoriel sur les groupages :
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    N'hésitez pas à revenir si vous rencontrez des problèmes, et si vous trouvez la solution bien entendu !

  5. #5
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    J'ai ajouter la fonction suivante dans la partie select
    " SUM (DocDetail.DocDetailQuantite) AS TotalQu "
    et le " GROUP BY DocDetail.DocDetailIdFamille " mais a l'execution il me dit que "Clients.Nom ne fait pas partie de la clause GROUP BY " et je ne souhaites pas faire une Groupement sur cette colonne

  6. #6
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 106
    Points
    3 106
    Par défaut
    Regarde du côté du partitionnement des résultats.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM (DocDetail.DocDetailQuantite) over(partition by DocDetail.DocDetailIdFamille order by DocDetail.DocDetailIdFamille) AS TotalQu

  7. #7
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Ouchti

    Je suis un peut nouveau dans le domaine SQL

    sa se vois déjà a la syntaxe de ma requête

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Waldar Voir le message
    AND dad.DateEcheance between {d '2011-01-26'} and {d '2001-02-01'}
    Attention WALDAR, évitez les fonctions ODBC !!! { } , c'est spécifique, non SQL, non portable, obsolète et contre performant (transformation en SQL)

    Plus simplement :

    AND dad.DateEcheance between '20110126' and '20010201'


    Citation Envoyé par calagan99

    Regarde du côté du partitionnement des résultats.
    Code :

    SUM (DocDetail.DocDetailQuantite) over(partition BY DocDetail.DocDetailIdFamille ORDER BY DocDetail.DocDetailIdFamille) AS TotalQu


    Attention calagan99, SQL Server ne supporte pas encore les fonctions de fenêtrage avec clause ODER BY pour les agrégats (SUM, COUNT...).

    A +

  9. #9
    Membre confirmé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Points : 457
    Points
    457
    Par défaut
    Bonjour SQLPro

    Dans le format de date utilisé, cela tient t'il compte de la culture ou paramètres régionaux , ou cela est totalement indifférent ????

  10. #10
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 106
    Points
    3 106
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Attention calagan99, SQL Server ne supporte pas encore les fonctions de fenêtrage avec clause ODER BY pour les agrégats (SUM, COUNT...).

    A +
    En effet, je suis allé un peu vite en besogne
    Merci pour la remarque.

    Je rectifie donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM (DocDetail.DocDetailQuantite) over(partition BY DocDetail.DocDetailIdFamille) AS TotalQu

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    J'ignorais que c'était l'api ODBC, je pensais que c'était natif à SQL-Server.
    Je trouvais que c'était une bonne idée !

    Même si la comparaison de date peut se faire directement contre une chaîne de caractère au format ISO 8601 (yyyy-mm-dd ou yyyymmdd), jamais jamais jamais je ne le ferai ou même ne le conseillerai, c'est l'anarchie dans les explications par la suite.

    Comment faire comprendre simplement que les deux littéraux ne sont pas les mêmes dans cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select getdate() as d1, '20110201' as d2
     where getdate() >= '20110201'
     
    d1                      d2
    ----------------------- --------
    2011-02-01 16:50:11.627 20110201
    On voit bien que d2 est une chaîne dans le résultat, mais pourtant c'est une date dans le where !

    La fonction ODBC à au moins le mérite de lever toute incertitude :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select getdate() as d1, '20110201' as d2, {d '2011-02-01'} as d3
     where getdate() >= {d '2011-02-01'}
     
    d1                      d2       d3
    ----------------------- -------- -----------------------
    2011-02-01 16:50:36.877 20110201 2011-02-01 00:00:00.000
    Pour conclure, avec une petite jubilation :
    Ce serait tellement plus simple si SQL-Server se pliait à la norme et implémentait - comme Oracle - le mot-clef date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select date '2011-02-01'

Discussions similaires

  1. [AC-2010] Compter les enregistrements d'une requete avec condition et calcul
    Par [TTH]Antares dans le forum Access
    Réponses: 9
    Dernier message: 13/03/2015, 14h21
  2. Requete avec groupement par interval de date
    Par dublow dans le forum Développement
    Réponses: 4
    Dernier message: 20/06/2011, 21h01
  3. requete SQL avec groupement et ventilation par classe
    Par peio89 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/10/2006, 08h49
  4. Pb de requete avec 2 niveaux de groupement
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 13/02/2006, 17h34
  5. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18

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