Requête avec plusieurs IF
Résolu
Oholabi12345
Messages postés
511
Statut
Membre
-
Oholabi12345 Messages postés 511 Statut Membre -
Oholabi12345 Messages postés 511 Statut Membre -
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]
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
Résumé de la discussion
L'intégration d'une formule Excel complexe de calcul de CN dans une instruction SQL est explorée, en utilisant [SALAIRE BRUT] comme base et un calcul par paliers avec arrondi et multiplicateurs. Plusieurs propositions envisagent une traduction avec IF/ELSE ou IIF, et soulignent que les seuils 50 000 et 130 000 et les multiplications par 0,8 et 0,015 nécessitent précision. Des conseils insistent aussi sur la nécessité de simplifier la formule avant translation SQL et sur la question de ce que représente réellement le calcul '8/10' et son double usage dans les lignes.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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 testPRODUIT(ARRONDI(PRODUIT(I16;0,001);0);1000)*0,8<=50000
, il est inutile de testerPRODUIT(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.-
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)) ) ) ) -
-
-
-
-