Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 10/08/2011, 12h53   #1
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
Par défaut Soustraction de requete

Bien le bonjour,

Je souhaite dans le cadre de statistique compta,
afficher le TOP 10 des articles le plus vendu.

J'ai via cette requête, une première approche de la chose
Code :
1
2
3
4
5
6
SELECT TOP 10  bons_articles.reference, SUM(bons_articles.total_ttc)  AS total, SUM(bons_articles.qte) AS qte 
FROM bons_articles 
LEFT JOIN bons ON bons_articles.bon_id=bons.id 
WHERE  bons.type=0 
GROUP BY bons_articles.id,bons_articles.ref
ORDER BY qte DESC
Le type de bon 0 étant les factures

Il me faudrait maintenant prendre en compte les articles qui sont sur note de crédit, et qui n'ont donc pas conséquence pas été vendu
J'ai la meme table mais avec le type de bon 1 pour les note de crédit.
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 13h27   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Que voulez vous vraiment exprimer par "Prendre en compte" ?
Afficher une nouvelle somme, un nombre, soustraire a une somme, soustraire a un nombre ? ...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 13h29   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Une piste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT		TOP 10 BA.reference
		, SUM(BA.total_ttc) AS total
		, SUM(BA.qte) AS qte 
FROM		dbo.bons_articles AS BA
LEFT JOIN	dbo.bons AS B ON BA.bon_id = B.id
WHERE		B.type = 0
AND		B.id NOT IN
		(
			SELECT		BA.id
			FROM		dbo.bons_articles AS BA
			INNER JOIN	dbo.bons AS B ON BA.bon_id = B.id
			WHERE		B.type = 1
		)
GROUP BY	BA.id, BA.ref
ORDER BY	qte DESC
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 13h31   #4
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
La premier requête me donne par exemple que j'ai vendu (sur facture) 12 fois mon article A
Or cette article m'est revenu 2 fois car le client n'etait pas content. J'ai donc des note de crédit sur lequelle se trouve cette article

je voudrais donc arrivé a 12-2 = 10
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 13h53   #5
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
Quelque chose dans ce style ci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT aid, ref, SUM(qte) AS qte, SUM(total) AS total
FROM (
 
SELECT bons_articles.aid, bons_articles.ref, bons_articles.qte AS qte, bons_articles.total AS total
FROM bons_articles
JOIN bons ON bons.bid=bons_articles.bid
WHERE bons.tid IN (0)
 
UNION
 
SELECT bons_articles.aid, bons_articles.ref, -bons_articles.qte AS qte, -bons_articles.total AS total
FROM bons_articles
JOIN bons ON bons.bid=bons_articles.bid
WHERE bons.tid IN (1)
) 
GROUP BY aid, ref
evidement ca ne marche pas. syntaxe incorrecte
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h14   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Que donne ceci :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT TOP 10  
    bons_articles.reference, 
    SUM(CASE bons.type
            WHEN 0 THEN bons_articles.total_ttc
            ELSE -bons_articles.total_ttc
         END )  AS total, 
    SUM(CASE  bons.type
            WHEN 0 THEN bons_articles.qte
            ELSE -bons_articles.qte
        END ) AS qte 
FROM bons_articles 
LEFT JOIN bons 
    ON bons_articles.bon_id=bons.id 
WHERE  bons.type=0 
   OR bons.type = 1
GROUP BY bons_articles.id,bons_articles.ref
ORDER BY qte DESC
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h16   #7
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
cela me semble correct
je vient de trouver aussi ceci
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT TOP 10 aid, ref, SUM(qte) AS qte, SUM(total) AS total
FROM (
	SELECT bons_articles.aid, bons_articles.ref, bons_articles.qte AS qte, bons_articles.total AS total
	FROM bons_articles
	JOIN bons ON bons.bid=bons_articles.bid
	WHERE bons.tid IN (0,1)
 
	UNION ALL
 
	SELECT bons_articles.aid, bons_articles.ref, -bons_articles.qte AS qte, -bons_articles.total AS total
	FROM bons_articles
	JOIN bons ON bons.bid=bons_articles.bid
	WHERE bons.tid IN (6)
) AS toto
GROUP BY aid, ref
ORDER BY qte DESC
Quelle est la meilleur requete, entre ma solution et la solution de aieeeuuuuu, point de vue optimisation
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h39   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
A première vue que dirai que c'est celle d'aieeeuuuuu ...
Cela dit sans :

- la définition des tables et leurs index
- les statistiques IO (SET STATISTICS IO ON)
- le plan de requête réel (CTRL+M dans SQL Server Management Studio)

C'est difficile à dire

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket 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 08h52.


 
 
 
 
Partenaires

Hébergement Web