|
| Requête avec un calcul de somme |
| Iniciado por Jean Turcotte, 17,jun. 2019 00:45 - 15 respuestas |
| |
| | | |
|
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 17,junio 2019 - 00:45 |
Bonjour, je crée un Agenda contenant des RDV, j'utilise une requete pour calculer la somme des délais de chaque RDV de la date du jour. Lorsque je clic sur mon bouton test, la somme ne m'indique le nombre de RDV (3) mais juste le délai du dernier RDV de la date du jour et non la somme des 3.


HExécuteRequête(REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ,hRequêteDéfaut,"Vi1", DateDuJour) test est un numérique = HNbEnr(REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ) ToastAffiche(test + ": " + REQ_TOT_HEURE_DISPO_PAR_EMPLOYÉ.la_somme_Durée)
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.361 mensajes |
|
| Publicado el 17,junio 2019 - 07:35 |
Bonjour, Si on pouvait avoir le code SQL (touche F2 lors de l'aperçu) de ta requête, ce serait bien.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 17,junio 2019 - 13:31 |
Voilà!
SELECT CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE AS ID_DISPONIBILITE, CONTACT_PERSO_DISPONIBILITE.DateDebut AS DateDebut, CONTACT_PERSO_DISPONIBILITE.Datefin AS Datefin, CONTACT_PERSO_DISPONIBILITE.Image AS Image, CONTACT_PERSO_DISPONIBILITE.Importance AS Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu, CONTACT_PERSO_DISPONIBILITE.Notes AS Notes, CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre, CONTACT_PERSO_DISPONIBILITE.Ressource AS Ressource, CONTACT_PERSO_DISPONIBILITE.Titre AS Titre, CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition, CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue, Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée FROM CONTACT_PERSO_DISPONIBILITE WHERE CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye} AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue = {ParamDateAbsolue} GROUP by CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE, CONTACT_PERSO_DISPONIBILITE.DateDebut, CONTACT_PERSO_DISPONIBILITE.Datefin, CONTACT_PERSO_DISPONIBILITE.Image, CONTACT_PERSO_DISPONIBILITE.Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu, CONTACT_PERSO_DISPONIBILITE.Notes, CONTACT_PERSO_DISPONIBILITE.Ordre, CONTACT_PERSO_DISPONIBILITE.Ressource, CONTACT_PERSO_DISPONIBILITE.Titre, CONTACT_PERSO_DISPONIBILITE.Répétition, CONTACT_PERSO_DISPONIBILITE.NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.321 mensajes |
|
| Publicado el 17,junio 2019 - 14:13 |
Bonjour,
Plus simple ?
SELECT CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE AS ID_DISPONIBILITE, CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue, Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée FROM CONTACT_PERSO_DISPONIBILITE WHERE CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye} AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue = {ParamDateAbsolue} GROUP by CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE, CONTACT_PERSO_DISPONIBILITE.NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue
-- Bon dev, Jean-Pierre |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 17,junio 2019 - 15:29 |
Bonjour Jean-Pierre, Même après avoir simplifié la requête, le résultat reste le même.
D'autres idées?
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 72 mensajes |
|
| Publicado el 17,junio 2019 - 21:12 |
Bonjour Jean ?
Si tu enlève ta SUM() et GROUP BY est-ce que tu reçois plusieurs lignes ou seulement 1 ? Ta rubrique Durée est sous quel type ? Entier, Chaine, Date, Durée ?
Ca provient peut-être du type de ta rubrique, j'utilise toujours des entiers me donnant des minutes par exemple et je fais la conversion lors de l'affichage au besoin. J'ai jamais tester les calcul SQL avec la rubrique durée de HFSQL. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 17,junio 2019 - 22:21 |
C'est un numérique
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 18,junio 2019 - 03:51 |
J'ai créé ma requete SQL manuellement et ca fonctionne tres bien, quelqu,un pourrait me dire pourquoi celle du WLANGAGE ne fonctionne pas?
reqSumDelai est une Requête SQL = [ SELECT SUM(Durée) FROM CONTACT_PERSO_DISPONIBILITE WHERE NoEmploye = {ParamIDEmploye} AND DateAbsolue = {ParamDateAbsolue} ]
reqSumDelai.ParamIDEmploye = "Vi1" reqSumDelai.ParamDateAbsolue = DateDuJour()
HExécuteRequête(reqSumDelai) xTemp est numérique POUR TOUT reqSumDelai xTemp = reqSumDelai.Expr1 FIN
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 18,junio 2019 - 04:34 |
Après avoir approfondie la problématique des requêtes. Voici le code de la requête en WLANGAGE fonctionnel
SELECT Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée, CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue, CONTACT_PERSO_DISPONIBILITE.Contenu AS Contenu, CONTACT_PERSO_DISPONIBILITE.Auteur AS Auteur, CONTACT_PERSO_DISPONIBILITE.AvecRepetition AS AvecRepetition, CONTACT_PERSO_DISPONIBILITE.Catégorie AS Catégorie, CONTACT_PERSO_DISPONIBILITE.Importance AS Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu, CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre, CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition FROM CONTACT_PERSO_DISPONIBILITE WHERE CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye} AND Left(CONTACT_PERSO_DISPONIBILITE.DateAbsolue,8) = Left(SYSDATE,8) GROUP by CONTACT_PERSO_DISPONIBILITE.NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue, CONTACT_PERSO_DISPONIBILITE.Contenu, CONTACT_PERSO_DISPONIBILITE.Auteur, CONTACT_PERSO_DISPONIBILITE.AvecRepetition, CONTACT_PERSO_DISPONIBILITE.Catégorie, CONTACT_PERSO_DISPONIBILITE.Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu, CONTACT_PERSO_DISPONIBILITE.Ordre, CONTACT_PERSO_DISPONIBILITE.Répétition
Voici une image de la table en question, toutes les rubriques encadrées en rouge sont problématiques et empêche la requête de bien fonctionner si je les inclus dans la requête. Je n'ai trouvé aucun lien commun.

Des Idées?
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.361 mensajes |
|
| Publicado el 18,junio 2019 - 08:39 |
Ta requête fait le calcul de la durée pour chaque ID donc retourne 3 enregistrements avec la durée de chaque enregistrement.
SELECT COUNT(CONTACT_PERSO_DISPONIBILITE.ID_DISPONIBILITE) AS NB_RDV, SUM(CONTACT_PERSO_DISPONIBILITE.Durée) AS DuréeTotale FROM CONTACT_PERSO_DISPONIBILITE WHERE Disponibilite.NoEmployé = {pEmployé} AND Disponibilite.DateAbsolue = {pDate}
-- Il y a peut être plus simple, mais, ça tourneMensaje modificado, 18,junio 2019 - 08:42 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 18,junio 2019 - 13:43 |
Jean TURCOTTE a écrit :
Après avoir approfondie la problématique des requêtes. Voici le code de la requête en WLANGAGE fonctionnel SELECT Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée, CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue, CONTACT_PERSO_DISPONIBILITE.Contenu AS Contenu, CONTACT_PERSO_DISPONIBILITE.Auteur AS Auteur, CONTACT_PERSO_DISPONIBILITE.AvecRepetition AS AvecRepetition, CONTACT_PERSO_DISPONIBILITE.Catégorie AS Catégorie, CONTACT_PERSO_DISPONIBILITE.Importance AS Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere AS JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu AS Lieu, CONTACT_PERSO_DISPONIBILITE.Ordre AS Ordre, CONTACT_PERSO_DISPONIBILITE.Répétition AS Repetition FROM CONTACT_PERSO_DISPONIBILITE WHERE CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye} AND Left(CONTACT_PERSO_DISPONIBILITE.DateAbsolue,  = Left(SYSDATE,  GROUP by CONTACT_PERSO_DISPONIBILITE.NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue, CONTACT_PERSO_DISPONIBILITE.Contenu, CONTACT_PERSO_DISPONIBILITE.Auteur, CONTACT_PERSO_DISPONIBILITE.AvecRepetition, CONTACT_PERSO_DISPONIBILITE.Catégorie, CONTACT_PERSO_DISPONIBILITE.Importance, CONTACT_PERSO_DISPONIBILITE.JournéeEntiere, CONTACT_PERSO_DISPONIBILITE.Lieu, CONTACT_PERSO_DISPONIBILITE.Ordre, CONTACT_PERSO_DISPONIBILITE.Répétition Mais alors qu'es-ce qui détermine qu'une rubrique supplémentaire me donne 3 résultats et que toutes celles déjà incluses me donne le calcul désiré. Je croyais à tord au départ que le lien était avec des rubrique indexés. C'est pourtant très important de savoir ça.
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.361 mensajes |
|
| Publicado el 18,junio 2019 - 14:12 |
Cela provient du GROUP BY. On appelle les fonction SQL COUNT, SUM ... des agrégats ou fonction d'agrégation. Les calculs sont faits sur les rubriques identiques. Pour plus d'informations https://sql.sh/. Dans notre cas, sur tous les enregistrements correspondant au même NoEmployé. Si on enlève la condition "CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye}" on aura 1 ligne par employé à une date donnée. Si on inclus un GROUP BY ID... on aura tous les enregistrements, ID... est unique.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 72 mensajes |
|
| Publicado el 18,junio 2019 - 15:42 |
Pour faire suite à Voroltinquo, Aussi, il faut faire attention au rubriques date car, si elle sont on format AAAAMMJJHHmmSS chaque enregistrement risque d'être unique. C'est assez facile des oublier celles-là 
En bref, chaque LIGNE de données doit être UNIQUE pour que la SUM soit calculé. Enlève ta SUM et ton GROUP BY. Si une seule colonne d'une de tes ligne est différente, ta requête ne pourra pas les regrouper et faire ton agrégat. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 72 mensajes |
|
| Publicado el 18,junio 2019 - 16:03 |
Ta requête au Post #8 fonctionne car tu n'a pas de group by, il fait alors la SUM sur toute les lignes de ta tables.
Par contre aussitôt que tu veux sortir une rubrique (colonne) de plus en même temps que ton aggrégat, il doit obligatoirement être dans ton GROUP BY. Pour qu'il soit regrouper il faut que tout ce qu'il y a dans le GROUP BY soit IDENTIQUE. Il va alors faire la SUM de tout ce qui est identique.
Prénom Age Jean 18 Pierre 50 Jean 15 Jeanne 25 Pierre 50
SELECT Prénom, SUM(Age) FROM Personne GROUP BY Prénom
Va retourner 3 lignes la car il y a 3 noms différents et il va applique la somme sur l'age qui comporte les mêmes noms. Résultat :
Jean 33 (18+15) Pierre 100 (50+50) Jeanne 25 (25)
Par contre s'il y a plusieurs rubrique. Prénom Nom Age Jean Toto 18 Pierre Tata 50 Jean Tata 15 Jeanne Tata 25 Pierre Tata 50
SELECT Prénom, SUM(Age) FROM Personne GROUP BY Prénom
Va retourner la même chose que précédement car seul le Prénom est demander dans le GROUP BY.
Par contre
SELECT Prénom, Nom, SUM(Age) FROM Personne GROUP BY Prénom, Nom
Va retourner : Prénom Nom SUM Jean Toto 18 // Toto et Tata sont différent Jean Tata 15 // Toto et Tata sont différent Pierre Tata 100 (50+50) // Pierre ET Tata sont identique pour les 2 lignes donc la SUM est appliqués Jeanne Tata 25
Espérant t'avoir aider à comprendre  |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 18,junio 2019 - 18:22 |
Merci, explication très complète et surtout très utile. 
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1.396 mensajes |
|
| Publicado el 19,junio 2019 - 16:34 |
Grace à vous, je comprend mieux le fonctionnement des requêtes. J'aimerais toutefois savoir pourquoi une requête de l'éditeur de requêtes comme celle-ci fonctionne;
SELECT Sum(CONTACT_PERSO_DISPONIBILITE.Durée) AS la_somme_Durée, CONTACT_PERSO_DISPONIBILITE.NoEmploye AS NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue AS DateAbsolue FROM CONTACT_PERSO_DISPONIBILITE WHERE CONTACT_PERSO_DISPONIBILITE.NoEmploye = {ParamNoEmploye} AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue BETWEEN {DateDebut} AND {DateFin} GROUP by CONTACT_PERSO_DISPONIBILITE.NoEmploye, CONTACT_PERSO_DISPONIBILITE.DateAbsolue
J'aimerais recréer ce code en WLANGAGE mais je n'y arrive pas. La fonction SELECT ne prend que la SUM(...) et n'accepte aucune autre rubrique.
reqSumDelai est une Requête SQL = [ SELECT SUM(CONTACT_PERSO_DISPONIBILITE.Durée), CONTACT_PERSO_DISPONIBILITE.DateAbsolue FROM CONTACT_PERSO_DISPONIBILITE WHERE NoEmploye = {ParamIDEmploye} AND CONTACT_PERSO_DISPONIBILITE.DateAbsolue BETWEEN {DateDebut} AND {DateFin} GROUP BY CONTACT_PERSO_DISPONIBILITE.DateAbsolue ]
reqSumDelai.ParamIDEmploye = "Vi1" reqSumDelai.DateDebut = "20190601" reqSumDelai.DateFin = "20190618"
HExécuteRequête(reqSumDelai) xTemp est numérique POUR TOUT reqSumDelai xTemp = reqSumDelai.Expr1 ToastAffiche(reqSumDelai.DateAbsolue + ": " + xTemp) FIN
-- Jean Turcotte WX 24 Android 8.0 sur Galaxy S8 Laptop Lenovo I7 12GB Ram |
| |
| |
| | | |
|
| | | | |
| | |
|