[Résolu] Somme conditionnelles dans une requête

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

[Résolu] Somme conditionnelles dans une requête

Message par Bastouille »

Bonjour à tous,

J'avance dans une base de données de gestion de chantiers, j'attaque maintenant la gestion des paies avec. J'ai une table de pointages reliant des techniciens à des chantiers avec des temps de travail et des zones d'intervention. J'aimerai compter dans chaque mois le nombre total de jours travaillés, d'arrêts maladie, de RTT, ... , et le nombre de jours travaillés en zone 1, en zone 2, en zone 3, ... Tout ça dans une seule requête qui me servirait de base pour un rapport.
Je rencontre plusieurs soucis de sommes conditionnelles, qui je pense ont peut-être la même solution :
- Je n'arrive pas à compter le nombre de jours par mois dans chaque zone, sachant que la zone comptée pour la journée travaillée est celle du premier chantier (c'est à dire Min("Pointage"."HeureDebut") sur le jour concerné)
- Je n'arrive pas à faire la somme suivante : compter le nombre de jours par mois d'un type particulier (Travaillé, RTT, maladie, ...)
J'ai fait quelques requêtes d'essai, mais rien de concluant.
J'ai parcouru le tuto de Piaf sur les analyses croisées, mais je n'arrive pas à l'appliquer sur ma base (quand je comprends ce qu'il fait bien sûr).

Est-ce que quelqu'un peut m'aider svp ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Bastouille le 09 avr. 2020 10:09, modifié 1 fois.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Somme conditionnelles dans une requête

Message par jeanmimi »

Bonjour,
Comme je n'arrive pas à ouvrir la base Gestion,
Bastouille a écrit :Je n'arrive pas à compter le nombre de jours par mois dans chaque zone
la requête doit avoir la fonction Groupe pour les ID, les personnes et les mois, et la fonction COUNT pour le nombre de jours.
J'en créerai d'abord 1 par zone, puis ensuite, une Requête des requêtes.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

Bonjour Jeanmimi,

Même avec une requête par zone, je suis coincé, je n'arrive pas à avoir mon résultat (Requête Paie-CalculZone1Mois). Je ne dois pas mettre la condition au bon endroit.
Je renvoie la base
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

J'ai trouvé une partie de ma réponse, j'ai mis un "CASE WHEN" sur le champ de la requête et une fonction somme, et pas une condition sur la valeur du champ "RefZone". J'obtiens donc la répartition des jours dans les zones dans ma requête "Paie-CalculZoneMois". Je vais du coup faire qqc d'approchant pour le type de jour travaillé, c'est le même genre de calcul.

Par contre, cette requête "Paie-CalculZoneMois" est calculée d'après une première requête ("Paie-CalculZoneJour") qui me donne la zone pour chaque jour, mais je n'arrive pas à avoir ce que je cherche : si un poseur travaille sur plusieurs zones dans la journée j'aimerai ne retenir pour cette journée que la zone du premier chantier (ce qui se traduit par "Pointage"."HeureDebut" est minimal sur les tous les pointages de la journée) : comment traduire cette condition dans ma requête ?
Dans ma base jointe, le poseur "NomPoseur 1" pointe le 06/04 sur la zone 2 à 8h et la zone 4 à 10:40, comment ne retenir que la zone 2 pour la journée du 06/04 ?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Somme conditionnelles dans une requête

Message par HRk2o »

Bsr,

Ajouter les critères de selection
voir modifications ds la requête concernée et sa source
Gestion_V1.odb
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

Bonjour HRk2o,
Merci de t'être penché sur mon pb, mais ce n'est pas ce que je recherche : je ne dois pas avoir à choisir le poseur et la zone, mais j'aimerai une requête qui me donne pour tous les poseurs, pour tous les jours, soit la zone où ils ont travaillé s'ils n'ont travaillé que dans une zone dans la journée, soit s'ils ont travaillé dans plusieurs zones, la zone du premier chantier de la journée. Ma requête PaieCalculZoneMois prend le relais après pour compter le nbre de zones par mois.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Somme conditionnelles dans une requête

Message par HRk2o »

Bjr,
requête qui me donne pour tous les poseurs, pour tous les jours, soit la zone où ils ont travaillé s'ils n'ont travaillé que dans une zone dans la journée, soit s'ils ont travaillé dans plusieurs zones, la zone du premier chantier de la journée
Comme ceci où ts les critères sont réunis:
capecran.png
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

Bonjour,
Bastouille a écrit :soit s'ils ont travaillé dans plusieurs zones, la zone du premier chantier de la journée
J'ai bien tous les poseurs pour toutes les dates où ils ont travaillé, mais il faudrait que le 05/04/20 je ne vois apparaitre dans ma requête que la ligne
NomPoseur1 05/04/20 04:00:00 2
Les zones où NomPoseur1 a travaillé plus tard dans la journée ne m'intéressent pas.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Somme conditionnelles dans une requête

Message par jeanmimi »

Bastouille a écrit :que le 05/04/20 je ne vois apparaitre dans ma requête que la ligne
NomPoseur1 05/04/20 04:00:00 2
Que donnerait la Fonction MInimum, dans l'ébauche de Requête sur le champ HeureDebut ?
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

La requête :

Code : Tout sélectionner

SELECT "Techniciens"."Nom" AS "Poseur", "Pointage"."DatePointage", MIN( "Pointage"."HeureDebut" ) FROM { oj "Chantiers" LEFT OUTER JOIN "Clients" ON "Chantiers"."RefClient" = "Clients"."RefClient" RIGHT OUTER JOIN "Pointage" ON "Chantiers"."RefChantier" = "Pointage"."RefChantier" }, "Techniciens" WHERE "Pointage"."RefTechnicien" = "Techniciens"."RefTechnicien" GROUP BY "Techniciens"."Nom", "Pointage"."DatePointage"
me donne bien l'heure du premier chantier sur la journée concernée, mais comment avoir la zone correspondant ?

Si je rajoute la zone :

Code : Tout sélectionner

SELECT "Techniciens"."Nom" AS "Poseur", "Pointage"."DatePointage", MIN( "Pointage"."HeureDebut" ), "Clients"."RefZone" FROM { oj "Chantiers" LEFT OUTER JOIN "Clients" ON "Chantiers"."RefClient" = "Clients"."RefClient" RIGHT OUTER JOIN "Pointage" ON "Chantiers"."RefChantier" = "Pointage"."RefChantier" }, "Techniciens" WHERE "Pointage"."RefTechnicien" = "Techniciens"."RefTechnicien" GROUP BY "Techniciens"."Nom", "Pointage"."DatePointage"
ça me donne le message d'erreur suivant :
Not in aggregate function or group by clause: org.hsqldb.Expression@2a93ee0 in statement [SELECT "Techniciens"."Nom" AS "Poseur", "Pointage"."DatePointage", MIN( "Pointage"."HeureDebut" ), "Clients"."RefZone" FROM "Chantiers" LEFT OUTER JOIN "Clients" ON "Chantiers"."RefClient" = "Clients"."RefClient" RIGHT OUTER JOIN "Pointage" ON "Chantiers"."RefChantier" = "Pointage"."RefChantier" , "Techniciens" WHERE "Pointage"."RefTechnicien" = "Techniciens"."RefTechnicien" GROUP BY "Techniciens"."Nom", "Pointage"."DatePointage"]

Si je rajoute la zone avec la fonction groupe :

Code : Tout sélectionner

SELECT "Techniciens"."Nom" AS "Poseur", "Pointage"."DatePointage", MIN( "Pointage"."HeureDebut" ), "Clients"."RefZone" FROM { oj "Chantiers" LEFT OUTER JOIN "Clients" ON "Chantiers"."RefClient" = "Clients"."RefClient" RIGHT OUTER JOIN "Pointage" ON "Chantiers"."RefChantier" = "Pointage"."RefChantier" }, "Techniciens" WHERE "Pointage"."RefTechnicien" = "Techniciens"."RefTechnicien" GROUP BY "Techniciens"."Nom", "Pointage"."DatePointage", "Clients"."RefZone"
ça me donne deux lignes avec la journée du 6/04, avec l'heure de début du premier chantier et l'heure de début du 2e chantier : j'ai encore mes doublons !
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Somme conditionnelles dans une requête

Message par HRk2o »

Bsr/bjr,

la requète1 répond t-elle à ce que vous voulez?
Gestion_V2.odb
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Bastouille
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 28 janv. 2020 18:15

Re: Somme conditionnelles dans une requête

Message par Bastouille »

Bonjour HRk2o,

Ca correspond quasiment, j'ai modifié la requête 1 en groupant par mois sur "Paie-CalculZoneJour1"."DatePointage" et en supprimant le groupe sur la date seule, et j'obtiens mon analyse mensuelle (requête 2)!
Merci BEAUCOUP !
Passer par deux requêtes de calcul pour en faire cette troisième, j'aurais jamais trouvé ça tout seul.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache OpenOffice 4.1.7 sur Windows 10
et LibreOffice 6.4.2.2 sur Windows 10