Requête avec plusieurs IF

Résolu/Fermé
Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022 - Modifié le 25 sept. 2021 à 10:17
Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022 - 2 oct. 2021 à 12:34
Bonjour, Dans ma base de données précedente ; j'ai la requete REQ_PAIE qui permet de calculer les salaires et je dois ajouter un champ calculé qui sur excel fonctionne très bien et se présente ainsi sous excel: CN=

SI(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=50000;0;SI(ET(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8>50000;PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=130000)*0,8;PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-50000;0,015);SI(ET(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8>130000;PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=200000);SOMME(PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-130000;0,05);1200);SOMME(4700;PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-200000;0,1)))))


peut on l’intégrer en champ calculé dans cette instruction SQL:

SELECT PAIE.NUMERO_BULLETIN, PAIE.Date, PAIE.NOMBRE_JOUR, PAIE.CODE_EMPLOYE, EMPLOYE.NOM_EMPLOYE, EMPLOYE.NUMERO_CNPS, EMPLOYE.PRENOM_EMPLOYE, EMPLOYE.TITRE, EMPLOYE.ADRESSE, EMPLOYE.EMPLOI_OCCUPE, EMPLOYE.ID_SERVICE, SERVICE.DESIGNATION_SRVICE, EMPLOYE.ETABLISSEMENT_BANCAIRE, EMPLOYE.NUMERO_COMPTE_BANCAIRE, EMPLOYE.ID_CATEGORIE, CATEGORIE.LIBELLE_CATEGORIE, CATEGORIE.TAUX_CATEGORIEL, PAIE.SURSALAIRE, EMPLOYE.TAUX_TRANSPORT, [TAUX_TRANSPORT]*[NOMBRE_JOUR] AS TRANSPORT, PAIE.AUTRES_INDEMNITES, PAIE.CONGES, PAIE.[PRIME_D'ANCIENNETE], [NOMBRE_JOUR]*[TAUX_CATEGORIEL] AS [SALAIRE CATEGORIEL], [SALAIRE CATEGORIEL]*0.012 AS ITS, PAIE.GRATIFICATION, [SALAIRE CATEGORIEL]+[CONGES]+[PRIME_D'ANCIENNETE]+[SURSALAIRE]+[GRATIFICATION] AS [SALAIRE BRUT], EMPLOYE.VILLE
FROM SERVICE INNER JOIN ((CATEGORIE INNER JOIN EMPLOYE ON CATEGORIE.ID_CATEGORIE = EMPLOYE.ID_CATEGORIE) INNER JOIN PAIE ON EMPLOYE.CODE_EMPLOYE = PAIE.CODE_EMPLOYE) ON SERVICE.ID_SERVICE = EMPLOYE.ID_SERVICE;

la case I16 en excel représente dans la requete le champ [SALAIRE BRUT]


Configuration: Windows / Firefox 92.0

1 réponse

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
23 sept. 2021 à 20:24
bonjour,
en SQL, la fonction iif() permet de faire le même genre de calcul.

avant de "traduire" cette formule en SQL, je suggère de sérieusement la simplifier.

d'une part, la fonction "produit()" rend la formule illisible.
je vois même PRODUIT(PRODUIT()), encore moins lisible.

d'autre part, certains tests sont inutiles:
par exemple, quand on est dans le "else" du test
PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=50000
, il est inutile de tester
PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8>50000
, cela ne fait qu'alourdir et obscurcir la formule.

je vois aussi que, dans la formule, on multiplie le résultat de la fonction ET() par 0.8: sans doute une erreur.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
Modifié le 23 sept. 2021 à 20:35
il est préférable de présenter le formule ainsi, cela aide à l'analyser et à la simplifier:
SI(
 PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=50000;
 0;
 SI(
  ET(
   PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8>50000;
   PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=130000
  )*0,8;
  PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-50000;0,015);
  SI(
   ET(
    PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8>130000;
    PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=200000
   );
   SOMME(PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-130000;0,05);1200);
   SOMME(4700;PRODUIT(PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8-200000;0,1))
  )
 )
)
0
Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022 1 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
23 sept. 2021 à 22:00
Ici on a 3 SI, je pense qu'on ne peut pas utiliser iff
Cette instructions je la mets à quel niveau
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022
24 sept. 2021 à 10:04
avant de "traduire" cette formule en SQL, je suggère de sérieusement la simplifier.
0
Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022 1 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
Modifié le 25 sept. 2021 à 10:11
Bonjour, je travaille actuellement sur la formule enfin de la simplifier mais que représentent les ponts virgules en fin de la deuxième lignes
Exemple : PRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=130000 )*0,8;
Pour le reste je pense pouvoir m'en sortir
Merci
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > Oholabi12345 Messages postés 498 Date d'inscription vendredi 21 août 2020 Statut Membre Dernière intervention 29 octobre 2022
25 sept. 2021 à 11:03
les point virgules sont les séparateurs de paramètres, ils étaient présents dans la formule initiale.
0