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 16/11/2011, 09h28   #1
Nouveau Membre du Club
 
Mickaël
Inscription : février 2011
Messages : 82
Détails du profil
Informations personnelles :
Nom : Mickaël

Informations forums :
Inscription : février 2011
Messages : 82
Points : 37
Points : 37
Par défaut Double somme dans même requête

Bonjour,
Pas sur que je sois au bon endroit pour poster ce message menfin bon je n'ai pas trouvé de forum SQL.
Bref, mon idée est de calculer 2 sommes dans une même requête.... J'ai essayé plusieurs solutions et n'ai pas encore trouvé mon bonheur.. Je vous explique:

J'aimerais pour chaque article:
-calculer le stock (en faisant une somme des mouvements de stock)
-calculer le total des précommandes en faisant la somme de toutes les lignes de pré-commande.
Et dans la même requête ne sélectionner que les lignes dont stock<pré-commandes.

Pour l'instant je fais (grossomodo) cela:
Code :
1
2
3
4
5
6
7
8
9
10
WITH T AS (
SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
FROM ARTICLES 
LEFT JOIN STOCK ON PATATIPATATA
GROUP BY CODARTICLE
) 
SELECT CODARTICLE, STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
FROM T 
LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
GROUP BY CODARTICLE, STOCKTHEORIQUE
Je calcule donc bien pour chaque article le stock+ la quantité de précommandes.
mais je ne sais pas comment ne sélectionner que ceux où stock<précommandes.
Je voulais ré-inclure tout ça dans un WITH ... mais cela ne passe pas.
Là je crois qu'il me manque une notion SQL importante!!

Merci pour votre aide
MickSou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 09h35   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 097
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 097
Points : 1 914
Points : 1 914
Bonjour,
Peut-être avec une clause HAVING en plus ?
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
 
WITH T AS (
SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
FROM ARTICLES 
LEFT JOIN STOCK ON PATATIPATATA
GROUP BY CODARTICLE
) 
SELECT CODARTICLE, STOCKTHEORIQUE, SUM(QTPRECOMMANDES) AS PRECOMMANDES
FROM T 
LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
GROUP BY CODARTICLE, STOCKTHEORIQUE
HAVING STOCKTHEORIQUE< SUM(QTPRECOMMANDES)

tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 09h41   #3
Nouveau Membre du Club
 
Mickaël
Inscription : février 2011
Messages : 82
Détails du profil
Informations personnelles :
Nom : Mickaël

Informations forums :
Inscription : février 2011
Messages : 82
Points : 37
Points : 37
EFffectivement ça marche, merci Tatayoyo!!
ma difficulté était aussi de gérer un case pour cette somme en fonction de l'unité de commande du coup cela done apu près ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
WITH T AS (
SELECT CODARTICLE, SUM(QTSTOCK)AS STOCKTHEORIQUE 
FROM ARTICLES 
LEFT JOIN STOCK ON PATATIPATATA
GROUP BY CODARTICLE
) 
SELECT CODARTICLE, STOCKTHEORIQUE, 
CASE UNITE 
  WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
  WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
END AS PRECOMMANDES
FROM T 
LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA
GROUP BY CODARTICLE, STOCKTHEORIQUE
HAVING STOCKTHEORIQUE< CASE UNITE 
  WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
  WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
END
Etant donnée que cela me semble quand meme super lourd est-ce qu'il y a une méthode plus propre/efficace pour ce genre de cas (double sommes)?
MickSou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 14h03   #4
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 7 828
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur C++\Delphi
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juillet 2006
Messages : 7 828
Points : 10 527
Points : 10 527
On a apporté une solution plus normée dans la section Delphi : Double somme dans meme requete


Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT CODARTICLE, SUM(QTSTOCK) AS STOCKTHEORIQUE, 
  SUM(
    CASE UNITE 
      WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
      WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
    END
  ) AS PRECOMMANDES
FROM ARTICLES
LEFT JOIN STOCK ON PATATIPATATA_STOCK
LEFT JOIN LIGNESCOMMANDES ON PATATIPATATA_LIGNE
GROUP BY ARTICLES.CODARTICLE
HAVING SUM(QTSTOCK) < SUM(
                       CASE UNITE 
                         WHEN POIDS THEN SUM(POIDSPRECOMMANDES)
                         WHEN PIECE THEN SUM(PIECESPRECOMMANDEES)
                       END
                     )

Pour les éventuels NULL
QTPRECOMMANDES -> CASE WHEN QTPRECOMMANDES IS NULL THEN 0 ELSE QTPRECOMMANDES END
__________________
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !

L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Parisien ! Dites NON à la VO ST au Cinéma !
Soit VF Soit VO sans sous-titre
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 14h14   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Juste deux remarques :
- La clause WITH, c'est de la norme (SQL 1999). Ca passe au moins sous Oracle 9+, SQL Server (je sais plus quelle version), Postgres, DB2 (il me semble)
- Toujours normé, COALESCE(QTPRECOMMANDES, 0) permet de remplacer ton CASE ... IS NULL
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann 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 13h35.


 
 
 
 
Partenaires

Hébergement Web