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 21/03/2011, 14h37   #1
Membre actif
 
Inscription : février 2008
Messages : 131
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 131
Points : 175
Points : 175
Par défaut Requête SUM avec conditions

Bonjour à tous,

Je travaille avec des fichiers hyperfiles
J'ai un fichier avec 3 rubriques (Date,Type,Quantité)
Je veux faire une requête qui me donnera pour chaque date :

*la quantité totale
*la quantité totale pour type = 1
*la quantité totale pour type = 2
*la quantité totale pour type = 3

Code :
SELECT DISTINCT(Date),SUM(Quantité),SUM(IF(Type=1,Quantité,0) etc...
J'ai testé en faisant des SUM IF mais sans succès.
Peut être une erreur de syntaxe.
Comment procédez-vous pour faire ce type de requête ?

Je vous remercie d'avance
madsland est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h43   #2
Membre Expert
 
Avatar de mail.spam
 
Homme Sylvain
Développeur Windev et technicien maintenance
Inscription : janvier 2008
Messages : 1 221
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 33
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Windev et technicien maintenance
Secteur : Industrie

Informations forums :
Inscription : janvier 2008
Messages : 1 221
Points : 2 062
Points : 2 062
Bonjour,

J'utiliserai la syntaxe avec group by

Un truc du genre.

Code :
1
2
3
4
SELECT Date, Type, SUM(Quantité)
FROM ...
GROUP BY  Date, Type
ORDER BY Type
__________________
la touche est ton amie. l'aide ne mord pas quand on la consulte...
PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider.
Un exemple vaut mieux que de longs discours...


Pensez à utiliser les votes, merci
mail.spam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h52   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
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 081
Points : 1 875
Points : 1 875
Bonjour,
La requête de base me parait correcte, mais sans le distinct qui ne sert ici à rien, et risque surtout de fausser les résultats.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h56   #4
Modérateur
 
Avatar de L.nico
 
Homme Nicolas LAURET
Chef de projet en SSII
Inscription : novembre 2003
Messages : 1 024
Détails du profil
Informations personnelles :
Nom : Homme Nicolas LAURET
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2003
Messages : 1 024
Points : 1 744
Points : 1 744
Bonjour,
en se basant sur la requête de mail.spam,
on peut même obtenir les quantités totale par jour en optant pour un type fictif de regroupement avec un union, ex :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT Date, Type, SUM(Quantité)
FROM ...
GROUP BY  Date, Type
 
UNION ALL
 
SELECT Date, 99999 AS Type, SUM(Quantité)
FROM ...
GROUP BY  DATE
 
ORDER BY Type
Mais c'est un problème de langage SQL et pas Windev.
__________________
Modérateur Business Intelligence / Windev

A lire avant de poster
Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton
L.nico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 14h57   #5
Membre actif
 
Inscription : février 2008
Messages : 131
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 131
Points : 175
Points : 175
Merci Mail.Spam pour cette réponse, cependant cela ne résout pas mon problème, j'ai vraiment besoin d'avoir 1 colonne pour chaque type.

@tatayo : Pourquoi mon DISTINCT servirait -il à rien ?
La requête n'est pourtant pas comprise par Windev

Merci à vous deux

EDIT : Je sais que c'est plutôt un problème de langage SQL, cependant ça à l'air de fonctionner pour d'autres SGBD d'après quelques recherches mais pas en Hyperfile
madsland est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h02   #6
Membre Expert
 
Avatar de mail.spam
 
Homme Sylvain
Développeur Windev et technicien maintenance
Inscription : janvier 2008
Messages : 1 221
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 33
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Windev et technicien maintenance
Secteur : Industrie

Informations forums :
Inscription : janvier 2008
Messages : 1 221
Points : 2 062
Points : 2 062
Citation:
Envoyé par madsland Voir le message
J'ai vraiment besoin d'avoir 1 colonne pour chaque type.
Désolé mais tu n'en a rien dis. Donc je ne pouvais pas le savoir.

Ce que tu veux c'est un ligne par dates différentes avec une colonne total et une colonne par type. En gros tu veux faire "un tableaux croisé dynamique sous excel" ?
C'est bien ça?
__________________
la touche est ton amie. l'aide ne mord pas quand on la consulte...
PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider.
Un exemple vaut mieux que de longs discours...


Pensez à utiliser les votes, merci
mail.spam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h03   #7
En attente de confirmation mail
 
Inscription : février 2005
Messages : 1 731
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : février 2005
Messages : 1 731
Points : 2 010
Points : 2 010
Bonjour,

Citation:
Envoyé par madsland Voir le message
J'ai un fichier avec 3 rubriques (Date,Type,Quantité)
Je veux faire une requête qui me donnera pour chaque date :

*la quantité totale
*la quantité totale pour type = 1
*la quantité totale pour type = 2
*la quantité totale pour type = 3

Code :
SELECT DISTINCT(Date),SUM(Quantité),SUM(IF(Type=1,Quantité,0) etc...
J'ai testé en faisant des SUM IF mais sans succès.
Peut être une erreur de syntaxe.
Ton champ est vraiment nommé Date !?
Mauvaise idée car ce sera la cause de soucis, surtout en "SQL pur".
Trouve un nom plus spécifique.

Je ne crois pas qu'il existe une instruction SQL IF pour HyperFile.
En revanche, l'instruction CASE ... WHEN ... THEN ... ELSE ... END semble adaptée à ton besoin.
http://doc.pcsoft.fr/fr-FR/?2034005&...iteur#NOTE2_45

Comme mail.spam, je te conseille un regroupement sur le champ Date.

Code SQL :
1
2
3
4
5
SELECT UneDate, 
    SUM(Quantité), 
    SUM(CASE Type WHEN 1 THEN Quantité ELSE 0 END), 
    SUM(CASE Type WHEN 2 THEN Quantité ELSE 0 END)
GROUP BY UneDate

A tester.
_
=JBO= est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h06   #8
Membre émérite
 
Homme
Inscription : mars 2002
Messages : 825
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations forums :
Inscription : mars 2002
Messages : 825
Points : 838
Points : 838
C'est un DECODE qu'il faut utiliser dans ce cas.
Code :
1
2
3
4
5
6
7
 
SELECT Date
, SUM(DECODE(Type, 1, Quantité, 0)) AS Qte1
, SUM(DECODE(Type, 2, Quantité, 0)) AS Qte2
, SUM(DECODE(Type, 3, Quantité, 0)) AS Qte3
FROM ...
GROUP BY Date
Pour ta seconde question,
Le distinct est totalement inutile dans une requête comprenant un GROUP BY.

Et comme tout ce qui est inutile dans HF, évite de l'utiliser, ça t'évitera des surprises.
Bowen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h12   #9
Membre actif
 
Inscription : février 2008
Messages : 131
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 131
Points : 175
Points : 175
Merci à vous tous, je ne pensé pas avoir autant de réponse en si peu de temps.
La solution de JBO fonctionne à merveille.
Non je n'ai pas nommé ma rubrique Date, c'était juste pour que ça soit plus clair à comprendre.
Je m'en vais testé celle de Bowen, histoire d'en savoir un peu plus.
Merci pour tous vos conseils
madsland est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 15h28   #10
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
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 081
Points : 1 875
Points : 1 875
Citation:
Envoyé par madsland Voir le message
@tatayo : Pourquoi mon DISTINCT servirait -il à rien ?
Le distinct ici ne sert à rien car tu regroupes les lignes du résultat sur cette colonne.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 16h34   #11
Membre Expert
 
Avatar de mail.spam
 
Homme Sylvain
Développeur Windev et technicien maintenance
Inscription : janvier 2008
Messages : 1 221
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Âge : 33
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Windev et technicien maintenance
Secteur : Industrie

Informations forums :
Inscription : janvier 2008
Messages : 1 221
Points : 2 062
Points : 2 062
Citation:
Envoyé par Bowen Voir le message
C'est un DECODE qu'il faut utiliser dans ce cas.
Bonjour BOWEN,

Je ne connaissais pas la fonction decode ( une nouvelle chose d'apprise pour moi, merci).

ATTENTION
Petit bemol l'aide de windev indique
Citation:
DECODE n'est pas géré par SQL Server, MySQL, Progress, Informix, DB2, Sybase et ACCESS. pour l'accès natif.
Donc il faut faire attention car s'il y a changement de type de base il faudra reprendre le code.

Enfin d'après ce que j'ai lu car je n'ai aucun retour d'expérience dessus.
__________________
la touche est ton amie. l'aide ne mord pas quand on la consulte...
PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider.
Un exemple vaut mieux que de longs discours...


Pensez à utiliser les votes, merci
mail.spam 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 20h28.


 
 
 
 
Partenaires

Hébergement Web