Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 19/03/2011, 23h54   #1
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
Par défaut Aide sur GROUP BY (débutant)

Bonsoir à tous et pour le dérangement!

J'ai du mal a`me sortir d'un GROUP BY :

Mes tables :

BonLivraison --> BL : NumBL,DateBL
LigneBL --> LBL : NumBL,Reference,Quantite
Produit --> P : Reference,LibProd

Et Voici ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT 
	SUM(LBL.Quantite) AS qte,
	LBL.Reference ref,
	P.LibProd lib, 
	P.Poids_Produit pds,
	P.Poids_Contenant pdsc,
	P.Poids_Emball pdse,
	BL.DateBL Date,
	BL.NumBL n
 
FROM LigneBl LBL
 
INNER JOIN Produit P ON P.Reference=ref
INNER JOIN BonLivraison BL ON BL.NumBL=LBL.NumBL
 
WHERE Date BETWEEN '20110101' AND '20110319'
 
AND LBL.Annule=0
 
GROUP BY lib,ref,pds,pdsc,pdse,Date,n
 
ORDER BY lib
J'ai compris qu'il faut faire apparaitre toutes les colonnes dans le GROUP BY mais ...

La requête fonctionne mais me détaille tout ligne par ligne avec chaque lib de produit or je souhaiterai un regroupement par libellé produit uniquement!

Si j'enlève les autres colonnes du GROUP BY la requête ne me renvoie rien

Par contre cette autre requête fonctionne bien : Je n'ai qu'un seul produit par ligne mais malheuresement je n'arrive pas à poser la borne sur la date de la Table BL

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
	SUM(LBL.Quantite) AS qte,
	LBL.Reference ref,
	P.LibProd lib, 
	P.Poids_Produit pds,
	P.Poids_Contenant pdsc,
	P.Poids_Emball pdse,
 
FROM LigneBl LBL
 
INNER JOIN Produit P ON P.Reference=ref
INNER JOIN BonLivraison BL ON BL.NumBL=LBL.NumBL
 
WHERE LBL.Annule=0
 
GROUP BY lib,ref,pds,pdsc,pdse
 
ORDER BY lib
Merci d'avance pour l'aide
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 00h41   #2
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
Rebonsoir, finalement j'y suis arrivé avec une sous requête!

Avez vous un conseil pour savoir automatiquement quand utiliser la sous requête?
Comment acquérir les réflexes pour s'orienter vers tel ou tel type de requêtes?

D'ailleurs je ne suis pas sûr que ce soit la meilleure solution, du moins optimisé?

Merci de me confirmer mon chef d'oeuvre afin que je mette vite résolu...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
	SUM(LBL.Quantite) AS qte,
	LBL.Reference ref,
	P.LibProd lib, 
	P.Poids_Produit pds,
	P.Poids_Contenant pdsc,
	P.Poids_Emball pdse
 
FROM LigneBl LBL
 
INNER JOIN Produit P ON P.Reference=ref
 
WHERE LBL.NumBL IN (SELECT BL.NumBL,
BL.DateBL Date
FROM BonLivraison BL
WHERE Date BETWEEN '20110101' AND '20110319')
AND LBL.Annule=0
GROUP BY lib,ref,pds,pdsc,pdse
ORDER BY lib
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2011, 11h04   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
SELECT
SUM(LBL.Quantite) AS qte,
LBL.Reference ref,
P.LibProd lib,
P.Poids_Produit pds,
P.Poids_Contenant pdsc,
P.Poids_Emball pdse

FROM LigneBl LBL

INNER JOIN Produit P ON P.Reference=ref

WHERE LBL.NumBL IN (SELECT BL.NumBL,
BL.DateBL Date
FROM BonLivraison BL
WHERE Date BETWEEN '20110101' AND '20110319')
AND LBL.Annule=0
GROUP BY lib,ref,pds,pdsc,pdse
ORDER BY lib
Cette requête fonctionne?

Vous avez deux colonnes retournées par votre sous requete IN, supprimez la colonne Date.

Je remplacerais le IN par un EXISTS personnellement.

Par contre pensez à préciser de quelle table proviennent toutes vos colonnes cela évite au moteur de devoir chercher, et précisez les schémas de vos tables pour la même raison.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
SUM(LBL.Quantite) qte,
LBL.Reference ref,
P.LibProd lib, 
P.Poids_Produit pds,
P.Poids_Contenant pdsc,
P.Poids_Emball pdse

FROM dbo.LigneBl LBL

INNER JOIN dbo.Produit P ON P.Reference=LBL.Reference

WHERE EXISTS (SELECT * 

FROM dbo.BonLivraison BL
WHERE  BL.NumBL=LBL.NumBL AND Date BETWEEN '20110101' AND '20110319')
AND LBL.Annule=0
GROUP BY LBL.Reference,
P.LibProd, 
P.Poids_Produit,
P.Poids_Contenant,
P.Poids_Emball
ORDER BY P.LibProd
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 00h08   #4
Membre éprouvé
 
Inscription : avril 2008
Messages : 554
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 554
Points : 402
Points : 402
Merci Iberserk!

mais j'ai oublié de préciser que j'utilise Windev et HFSQL est (je crois) de loin différent de la norme SQL.
J'obtiens donc des erreurs sur la sous requête que je suppose est dû au moteur de BDD.
Toutefois j'ai compris le principe et je passe en résolu!

Merci pour tout
zouzoukha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h10.


 
 
 
 
Partenaires

Hébergement Web