Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
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 20/10/2004, 08h51   #1
Membre régulier
 
Inscription : mai 2003
Messages : 119
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 119
Points : 80
Points : 80
Par défaut SUM avec firebird / interbase

Bonjour à tous,

Quand je fais la query ci-dessous, l'application ne me retourne pas le résultat souhaité.
Code :
1
2
3
4
5
6
 
SELECT DISTINCT(xnumint), xdate, sum(xnhp)
FROM xpresta
WHERE xdate >= '2003/01/01'
AND xdate <= '2003/01/31'
GROUP BY xnumint, xdate, xnhp
Voici le résultat que je reçois
Code :
1
2
3
4
5
6
7
 
XNUMINT XDATE          XNHP
---------------------------------
1       13/01/2003     39
1       15/01/2003     39
1       21/01/2003     39
1       28/01/2003     39
En fait la valeur dans la colonne xnhp correspond à un nombre d'heure, et j'aimerai pouvoir faire le total des heures sur 1 mois.
Donc il me faudrait comme résultat 156 dans XNHP pour XNUMINT = 1
Quelqu'un pourrait-il me donner la query adéquate pour cette opération
Merci d'avance pour votre aide

Jeankiki
Jeankiki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2004, 09h22   #2
Futur Membre du Club
 
Inscription : février 2004
Messages : 43
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 43
Points : 19
Points : 19
Essaie un truc du genre.

Il faut pouvoir selectionner le mois dans ton select.

je connais l'UDF extractmonth pour cela.

Code :
1
2
3
4
SELECT DISTINCT(xnumint), extractmonth(xdate), sum(xnhp) 
FROM xpresta 
WHERE  extractmonth(xdate)=10
GROUP BY xnumint, extractmonth(xdate)
Je ne te garantis rien, mais ca doit être dans ce genre la.
iguanevif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2004, 10h50   #3
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: SUM avec firebird / interbase

Citation:
Envoyé par Jeankiki
Code :
1
2
3
4
5
6
 
SELECT DISTINCT(xnumint), xdate, sum(xnhp)
FROM xpresta
WHERE xdate >= '2003/01/01'
AND xdate <= '2003/01/31'
GROUP BY xnumint, xdate, xnhp
C'est tout a fait normal, vous groupez par xnumint, xdate et xnhp.
Donc à chaque date différente il fa faire une ligne et même pire, à chaque xnhp différent il va faire une ligne...

Comme vous l'a expliqué iguanevif, il faut que vous changiez votre regroupement.

Donc par exemple :
Code :
1
2
3
4
5
6
 
SELECT xnumint, min(xdate), max(xdate), sum(xnhp)
FROM xpresta
WHERE xdate >= '2003/01/01'
AND xdate <= '2003/01/31'
GROUP BY xnumint
En résultat vous aurez une ligne par xnumint de distinct.
La première colonne correspond à xnumint, la seconde à la plus petite date trouvé, la triosième colonne à la plus grande date trouvée et la dernire colonne à la somme des xnhp pour ce xnumint.

Mais vous pouvez également changer votre test comme vous le suggère iguanevif (sans devoir utiliser une UDF c'est possible) :
Code :
1
2
3
4
5
 
SELECT xnumint, sum(xnhp)
FROM xpresta
WHERE extract(month FROM xdate) = 1
GROUP BY xnumint
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2004, 07h35   #4
Membre régulier
 
Inscription : mai 2003
Messages : 119
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 119
Points : 80
Points : 80
Merci à vous pour votre solution, ça fonctionne très bien.

Mais si tu veux grouper uniquement par xnumint et que tu fais ta query sans mettre de min et de max sur xdate, il te renvoi le message d'erreur suivant.
Erreur:
Invalid expression in the select list (not conteined in either an aggregate function or the GROUP BY clause).
Code :
1
2
3
4
5
6
 
SELECT xnumint, xdate, sum(xnhp)
FROM xpresta
WHERE xdate >= '2003/01/01'
AND xdate <= '2003/01/31'
GROUP BY xnumint
Jeankiki
Jeankiki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2004, 10h37   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Hummm un petit cours de SQL s'impose...

Ou juste un cours de logique (après tout le SQL n'est que de la logique ensembliste).

Vous avez un ensemble de données

Code :
1
2
3
4
5
6
XnumInt   Xdate    Xnhp
1        1/1/2004  10
2        2/1/2004  20
2        3/1/2004  30
1        4/1/2004  40
1        5/1/2004  50
Maintenant disont que je veuille regrouper mes lignes pour voir la somme des xnhp pour chacun des xnumint.
Donc le résultat sera :
Code :
1
2
3
XnumInt    Xnhp
1          100
2          50
C'est ce que fait la requete

Code :
1
2
SELECT xnumint, sum(xnhp) FROM matable
GROUP BY xnumint
Maintenant essayez de me dire ce que votre requete pourait donner comme résultat ou plutot ce que vous voudriez qu'elle donne comme résultat...
Code :
1
2
SELECT xnumint, xdate, sum(xnhp) FROM matable
GROUP BY xnumint
??
je groupe par xnumint, a chaque xnumint identique je somme les xnhp et que faire des xdates ??? Vu que je ne demande pas la plus petite ni la plus grande des xdate, comment voulez vous que le moteur SQL trouve un résultat ? Comment devrait t'il choissir une date parmis l'ensemble des dates ?
Pour xnumint = 1 je somme les xnhp = (10+40+50) et pour le xdate laquel afficher ? il y en a 3 de différentes ??? Bref vous comprenez bien qu'on ne peux pas mettre xdate seul comme ca si on ne regroupe que par xnumint. Donc soit on ne la met pas soit on dit au moteur SQL de prendre la plus petite xdate ou la plus grande xdate trouvé pour un xnumint donné.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2004, 23h13   #6
Membre régulier
 
Inscription : mai 2003
Messages : 119
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 119
Points : 80
Points : 80
ok, merci pour l'explication Bardibulle, c'est un peut plus clair maintenant.
Pourrais-tu m'aider pour le problème que j'ai à cette endroit.

http://www.developpez.net/forums/viewtopic.php?t=255932&highlight=

Je me doute que je ne peux sans doute pas te le demander à partir de se sujet, mais se serait bien sympa de ta part.

Merci d'avance

Jeankiki
Jeankiki 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 00h19.


 
 
 
 
Partenaires

Hébergement Web