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 23/06/2011, 16h55   #1
Invité de passage
 
Inscription : juin 2010
Messages : 16
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 16
Points : 0
Points : 0
Par défaut cumul progressif par client

Bonjour J'ai besoin d'avoir en sql le nom, prénom et cumul de QTE produits par client et je ne veux afficher que les lignes tel que le cumul dépasse une certaine valeur exemple.

table initiale c dans le fichier table


Résultat si cumul>=200 est dans le ficher résultat




Je vous remercie d'avance
Images attachées
Type de fichier : png table.png (12,6 Ko, 8 affichages)
Type de fichier : png résultat.png (25,1 Ko, 7 affichages)
helgo59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h16   #2
Membre confirmé
 
Homme antoine jouan
Étudiant
Inscription : janvier 2010
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme antoine jouan
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2010
Messages : 175
Points : 250
Points : 250
Bonjour,
Je ne suis pas sur d'avoir tout bien compris mais je vais essayer.

Alors si le cumul et bien l'addition de tes qts.

Tu peux faire une requete de type

Code :
1
2
 
SELECT les_champs_que_tu_desire, SUM(qt) AS cumul FROM ta_table WHERE cumul > 199
jouana est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 23/06/2011, 17h22   #3
Membre confirmé
 
Homme antoine jouan
Étudiant
Inscription : janvier 2010
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme antoine jouan
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2010
Messages : 175
Points : 250
Points : 250
Enfaîte, si c'est dans le même genre que t'on image résultat ce que tu désire c'est un peu plus compliqué, le plus simple et un requête avec toutes tes tuples et faire un traitement via un autre langage.

Sinon vas voir du coter des requêtes multiples avec des if et tout, mais je ne pense pas que ça soit la meilleur solution autant en terme de maintenance qui voudra reprendre la requête et en mise en place tu vas perdre plus de temps
jouana est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 23/06/2011, 21h50   #4
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
En fait vous voulez:


Le max avec la date correspondante puis le cumul global + date min et date max?
__________________
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 23/06/2011, 21h55   #5
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
Je ne comprends pas exactement le résultat escompté.

Citation:
SELECT les_champs_que_tu_desire, SUM(qt) AS cumul FROM ta_table WHERE cumul > 199
??? ce n'est pas du SQL ca!

La syntaxe pour filtrer l'agregat(SUM) est HAVING de la sorte:

Code :
1
2
3
4
SELECT colonne1,colonne2, SUM(qt) AS cumul
 FROM ta_table 
GROUP BY colonne1,colonne2 
HAVING SUM(qt)>199
__________________
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 24/06/2011, 11h21   #6
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
De toute façon la requête n'aurait pas été compilée puisque la syntaxe est fausse.
En effet, on ne peut pas spécifier une clause WHERE sur un alias de colonne, sauf si cet alias provient :

- d'une expression de table commune
- d'une sous-requête.

En revanche on peut le faire dans l'ORDER BY.
Cela est dû au fait que le plan de requête est construit à partir de la requête dans cet ordre :

- Traitement de la clause FROM / JOIN / APPLY
- Traitement des clauses WHERE/AND éventuelles
- Calcul de groupes si la clause GROUP BY existe
- Filtrage des groupes si la clause HAVING existe
- Ajout des colonnes et expressions du SELECT
- Tri suivant l'éventuelle clause ORDER BY.

@++
__________________
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 24/06/2011, 14h15   #7
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 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ce qui m'embête surtout c'est que votre résultat attendu ne correspond pas à vos données initiales, c'est un grand manque de rigueur.

Donc, avec un autre jeu de données je suppose que ce que vous voulez obtenir est la requête suivante :
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
25
26
27
28
29
30
31
32
; WITH MaTable (id_client, quantite, date_achat) AS
(
SELECT 1,  23, '1983-09-14' union ALL
SELECT 1,  22, '1995-01-12' union ALL
SELECT 1,  21, '2002-06-06' union ALL
SELECT 1, 145, '2004-06-11' union ALL
SELECT 1,  23, '2011-08-11' union ALL
SELECT 2,  25, '1983-09-10' union ALL
SELECT 2,  22, '1995-01-12' union ALL
SELECT 2,  21, '1997-01-12' union ALL
SELECT 2, 145, '2002-06-06' union ALL
SELECT 2,  23, '2011-08-11'
)
  SELECT t1.id_client, t1.quantite, t1.date_achat
       , sum(t2.quantite) AS cumul
       , min(t2.date_achat) AS date_min_date_achat
       , min(t1.date_achat) over(partition BY t1.id_client, sign(sum(t2.quantite)-200)) AS premiere_date
    FROM MaTable AS t1
         INNER JOIN MaTable AS t2
           ON t2.id_client   = t1.id_client
          AND t2.date_achat <= t1.date_achat
GROUP BY t1.id_client, t1.quantite, t1.date_achat
  HAVING sum(t2.quantite) >= 200
ORDER BY t1.id_client ASC, t1.date_achat ASC
 
 
id_client   quantite    date_achat cumul       date_min_date_achat premiere_date
----------- ----------- ---------- ----------- ------------------- -------------
1           145         2004-06-11 211         1983-09-14          2004-06-11
1           23          2011-08-11 234         1983-09-14          2004-06-11
2           145         2002-06-06 213         1983-09-10          2002-06-06
2           23          2011-08-11 236         1983-09-10          2002-06-06

Citation:
Envoyé par jouana Voir le message
Enfaîte, si c'est dans le même genre que t'on image résultat ce que tu désire c'est un peu plus compliqué, le plus simple et un requête avec toutes tes tuples et faire un traitement via un autre langage.

Sinon vas voir du coter des requêtes multiples avec des if et tout, mais je ne pense pas que ça soit la meilleur solution autant en terme de maintenance qui voudra reprendre la requête et en mise en place tu vas perdre plus de temps
Une mauvaise requête suivi d'un très mauvais conseil => -2 !
__________________
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 01h37.


 
 
 
 
Partenaires

Hébergement Web