Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2011, 10h38   #1
Membre confirmé
 
Avatar de thierry007
 
Homme Thierry RICAL
Développeur informatique
Inscription : août 2006
Messages : 584
Détails du profil
Informations personnelles :
Nom : Homme Thierry RICAL
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2006
Messages : 584
Points : 290
Points : 290
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 :
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
__________________
La Connaissance est comme la joie elle s'accroît en la partageant!
thierry007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 11h30   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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 ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 11h48   #3
Membre confirmé
 
Avatar de thierry007
 
Homme Thierry RICAL
Développeur informatique
Inscription : août 2006
Messages : 584
Détails du profil
Informations personnelles :
Nom : Homme Thierry RICAL
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2006
Messages : 584
Points : 290
Points : 290
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
Type de fichier : jpg resultat.jpg (40,5 Ko, 4 affichages)
__________________
La Connaissance est comme la joie elle s'accroît en la partageant!
thierry007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 14h19   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 14h54   #5
Membre confirmé
 
Avatar de thierry007
 
Homme Thierry RICAL
Développeur informatique
Inscription : août 2006
Messages : 584
Détails du profil
Informations personnelles :
Nom : Homme Thierry RICAL
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2006
Messages : 584
Points : 290
Points : 290
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
__________________
La Connaissance est comme la joie elle s'accroît en la partageant!
thierry007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 15h44   #6
Modérateur
 
Homme
Chef de projet NTIC
Inscription : avril 2007
Messages : 1 782
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : avril 2007
Messages : 1 782
Points : 2 764
Points : 2 764
Regarde du côté du partitionnement des résultats.
Code :
SUM (DocDetail.DocDetailQuantite) over(partition BY DocDetail.DocDetailIdFamille ORDER BY DocDetail.DocDetailIdFamille) AS TotalQu
calagan99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h21   #7
Membre confirmé
 
Avatar de thierry007
 
Homme Thierry RICAL
Développeur informatique
Inscription : août 2006
Messages : 584
Détails du profil
Informations personnelles :
Nom : Homme Thierry RICAL
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2006
Messages : 584
Points : 290
Points : 290
Ouchti

Je suis un peut nouveau dans le domaine SQL

sa se vois déjà a la syntaxe de ma requête
__________________
La Connaissance est comme la joie elle s'accroît en la partageant!
thierry007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h29   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h48   #9
Membre confirmé
 
Avatar de thierry007
 
Homme Thierry RICAL
Développeur informatique
Inscription : août 2006
Messages : 584
Détails du profil
Informations personnelles :
Nom : Homme Thierry RICAL
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : août 2006
Messages : 584
Points : 290
Points : 290
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 ????
__________________
La Connaissance est comme la joie elle s'accroît en la partageant!
thierry007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h51   #10
Modérateur
 
Homme
Chef de projet NTIC
Inscription : avril 2007
Messages : 1 782
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : avril 2007
Messages : 1 782
Points : 2 764
Points : 2 764
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 :
SUM (DocDetail.DocDetailQuantite) over(partition BY DocDetail.DocDetailIdFamille) AS TotalQu
calagan99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 16h57   #11
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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 :
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 :
SELECT date '2011-02-01'
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h01.


 
 
 
 
Partenaires

Hébergement Web