IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

table avec des colonnes calculées (table qui stocke des formules)


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut table avec des colonnes calculées (table qui stocke des formules)
    Bonjour,
    je travaille sur un projet de création d'une base de données destinée a la gestion de la paie du personnel au niveau d'un hôpital.
    pour mieux comprendre ma question je vais donner 3 exemples( ingénieur en informatique,technicien en informatique,médecin généraliste ) sur ce sujet
    l’hôpital est composé de deux services(c'est faux mais pour simplifier)
    service administration)
    service médical

    dans le service administration il y a ingénieur en informatique et technicien en informatique dans le service médical il y a médecin généraliste.
    j'ai une table appelée table indemnité elle contient tous les indemnités (éléments pour calculer la paie)
    liste des indemnites
    indemnite informatique1=Salairede base* 40% pour les ingenieurs et 25% pour les technicien
    indemnite informatique2=SALAIRE DE BASE*10% c'est la meme pour les ingenieurs et les technicien
    indeminite medical1=salaire de base*65%
    indeminité medical2=salaire de base*25%
    elements de paie des " cas

    ingénieur
    1-salaire de base
    2-indemnite informatique 1(40%)=salaire de base*40%
    3-indemnite informatique 2(10%)=salaire de base*10%

    technicien
    1-salaire de base
    2-indemnite informatique 1(25%)=salaire de base*25%
    3-indemnite informatique 2(10%)=salaire de base*10%

    MÉDECIN GÉNÉRALISTE
    1-salaire de base
    2-indeminite medical1=salaire de base*65%
    3-indeminité medical2=salaire de base*25%


    ma première question est la suivante:
    est ce que je creer une TABLE DES INDEMNITÉS avec
    ID_INDEMINITE,NOM_INDEMNITE ,FORMULE INDEMINITE
    si c'est un bon choix alors comment indiquer la formule de l(indeminite


    ou dois je créer pour chaque indemnité une fonction
    si c'est un bon choix comment appliquer ces fonctions au fonctionnaire .?

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Pourquoi ne pas simplement indiquer le pourcentage dans ta colonne de calcul ? 40, ou 0.4 pour 40% ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par rudib Voir le message
    Pourquoi ne pas simplement indiquer le pourcentage dans ta colonne de calcul ? 40, ou 0.4 pour 40% ?
    Bonjour M. Rudi
    je vais simplifier ;ma table employée est constitue des attributs suivants:
    ---------------------------------------------------------------|
    ID EMPLOYÉE|Salaire_de_base|Echelon|id_service|id_FONCTION -|
    ---------------------------------------------------------------|
    chaque employée appartient a un service
    les employées du même service ont le même nombre d’indemnités la différence se trouve dans les taux de ces derniers dans mon cas si deux fonctionnaires appartiennent au service informatique ils auront les même indemnités :
    indemnité informatique 1=si id_FONCTION=ingénieur alors indemnité informatique 1=Salaire_de_base*0,4 si id_FONCTION=technicien alors indemnité informatique 1=Salaire_de_base*0,25
    indemnité informatique 2=Salaire_de_base*0,1 (le taux est le même pour les deux fonctions)

    qd je vais calculer la paie il me faut sauvegarder la somme de toutes les indemnités de tous les employés
    donc
    j'ai crée une table indemnités_Employés elle est composée de
    --------------------------------------------------------------
    ID_EMPLOYÉE |indemnité_informatique1|indemnité_informatique2|
    ------------ --------------------------------------------------


    quand je veux insérer un nouvel employé je dois déterminer son service et après déterminer s'il est ingénieur ou technicien pour déterminer le taux appliqué

    donc ma question est la suivantes:

    comment indiquer a la colonne indemnité_informatique1 la condition suivantes
    si id_service=1(informatique) & SI id_FONCTION=1(ingénieur) alors
    insérer la valeur Salaire_de_base *0,4 dans la colonne indemnité_informatique1
    SINON indemnité_informatique1= Salaire_de_base*0,25

    comment dois je faire pour insérer un nouvel employés ?est ce que je peux utiliser une procédure stockée ou fonction si oui comment je peux realiser ca ?
    merci d'avance

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Et que contiendront les colonnes indemnite_informatique1 et indemnite_informatique2 pour votre...médecin généraliste ?

    avez vous besoin de connaitre ses indemnités intermédiaire, ou voulez vous simplement connaitre le montant final.

    Enfin, avec une telle solution, comment ferez vous quand le salaire d'un employé changera

    Il me parait plus adéquat de créer une vue pour implémenter vos calculs d'indémnité...

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Et que contiendront les colonnes indemnite_informatique1 et indemnite_informatique2 pour votre...médecin généraliste ?

    avez vous besoin de connaitre ses indemnités intermédiaire, ou voulez vous simplement connaitre le montant final.

    Enfin, avec une telle solution, comment ferez vous quand le salaire d'un employé changera

    Il me parait plus adéquat de créer une vue pour implémenter vos calculs d'indémnité...
    bonjour aieeeuuuuu;
    le calcule de toutes les indemnités Quel que soit le service(informatique ou medical )est basé sur deux valeurs : salaire_de base et échelon et ces deux attributs se trouvent dans la table employé
    ---------------------------------------------------------------|
    ID EMPLOYÉE|Salaire_de_base|Echelon|id_service|id_FONCTION -|
    ---------------------------------------------------------------|

    la différence entre les services se trouve dans le taux de ces indemnité et leurs nombre et leurs appellation
    example
    /^\
    / \
    service service
    informa médical
    ./ \
    / \
    indemnité inf1 indemnité qualification
    indemnité inf2 indemnité documentation
    indemnité contagion

    le calcule de ces 5 indemnités est basé sur salaire de base et échelon la
    différence se trouve dans:
    1-le taux appliqué
    2-le nombre de ces indemnités (toutes les personnes qui appartiennent au service informatique ont seulement deux indemnité indemnité inf1 et indemnité inf2 alors que le service médical a 3 indemnités )
    3-l'appelation de ces indemnités

    pour ta deuxième question Oui je dois comptabiliser le total pour chaque mois de ces indemnités


    pour ta suggestion est ce que la création d'une vue est plus pratique que la création de fonctions cad pour chaque indemnité je crée une fonction

    merci d'avance

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Pour ce que vous avez à faire, une vue me semble en effet plus simple.

    Vous pouvez simplement créer une vue V_EMPLOYE qui reprend les informations de la table EMPLOYE, et ajouter les indemnités. Ensuite vous pouvez travailler uniquement avec cette vue en lieu et place de votre table employe.

    Vous pouvez en effet aussi créer une fonction, mais je pense qu'il serait plus simple de faire une seule fonction qui gérer toute la logique métier, plutot qu'une fonction par service et par grade. Enfin, si vous faites une fonction, faite plutôt une fonction table en ligne, qui sera plus performante

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Merci aieeeuuuuu
    je vais essayer d’implémenter les deux suggestions qd je les termine je vais poster le code !

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Bonjour,
    est ce qu'on peut créer une fonction qui donne comme résultat un enregistrement et non pas une table et cet enregistrement sera stocké par la suite dans la table indemnité?

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je ne comprend pas trop votre dernière question. Une fonction table renvoi bien des lignes, après, vous en faites "ce que vous voulez".
    Si vous voulez les insérer tel quel dans une table, vous pouvez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO UnTable
        SELECT LesColonnes
        FROM dbo.LaFonctionTable

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci aieeuuuuuu pour ton aide
    Normalement avec ça vous allez comprendre mieux
    --------------------------------------------------------------
    ID_EMPLOYÉE |indemnité_informatique1|indemnité_informatique2|indemnité qualification|indemnité documentation|indemnité contagion
    ------------ --------------------------------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IF id_service=informatique and id=ingenieur  then
    INSERT INTO indemnite
        SELECT id_employé,(Salaire_de_base*0,4),(Salaire_de_base*0,1),0,0,0
        FROM dbo.employé
     
    IF id_service=informatique and id=TECHNICIEN  then
    INSERT INTO indemnite
        SELECT id_employé,(Salaire_de_base*0,25),(Salaire_de_base*0,1),0,0,0
        FROM dbo.employé
    IF id_service=MEDICAL   then
    INSERT INTO indemnites
        SELECT id_employé,0,0,(Salaire_de_base*0,65),(Salaire_de_base*0,25),(Salaire_de_base*0,30)
        FROM dbo.employé
    ma question est:
    ce code ou je vais l’écrire ?

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Comme je le disais, directement dans une vue :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    SELECT 
        id_employé
        ,
        CASE id_service
            WHEN 'informatique' THEN
                CASE id 
                    WHEN 'ingenieur' THEN Salaire_de_base*0,4
                    WHEN 'TECHNICIEN ' THEN Salaire_de_base*0,25
                END
            ELSE 0
        END AS indemnité_informatique1
        ,
        CASE id_service
            WHEN 'informatique' THEN Salaire_de_base*0,1
            ELSE 0
        END AS indemnité_informatique2
        ,
        CASE id_service
            WHEN 'MEDICAL' THEN Salaire_de_base*0,65
            ELSE 0
        END AS indemnite_qualification
    ,
    ...
    FROM dbo.employe
    Cependant pour ma part, Je mettrai plutôt une ligne par indemnité, cela simplifierai le calcul du total des indemnités, ainsi que les futures évolutions

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci aieeuuuuu ,c'est exactement ça que je voulais.
    maintenant ma deuxième question est

    --------------------------------------------------------------
    ID_EMPLOYÉE|date|indemnité_informatique1|indemnité_informatique2|indemnité qualification|indemnité documentation|indemnité contagion
    ------------ --------------------------------------------------
    je veux faire ça avec 600 fonctionnaires chaque mois =insertion de 600 ENREGISTREMENTS dans la table indemnités chaque mois
    la table indemnités sert a calculer la paie pour 600 fonctionnaires et en même temps c'est un historiques pour les précédents mois
    comment je peux insérer ces données en se basant sur id_employé de la table employé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    for id_employé=1 to dernier enregistrement dans la table employé
    INSERT INTO indemnite
    SELECT 
        id_employé
        ,
        CASE id_service
            WHEN 'informatique' THEN
                CASE id 
                    WHEN 'ingenieur' THEN Salaire_de_base*0,4
                    WHEN 'TECHNICIEN ' THEN Salaire_de_base*0,25
                END
            ELSE 0
        END AS indemnité_informatique1
        ,
        CASE id_service
            WHEN 'informatique' THEN Salaire_de_base*0,1
            ELSE 0
        END AS indemnité_informatique2
        ,
        CASE id_service
            WHEN 'MEDICAL' THEN Salaire_de_base*0,65
            ELSE 0
        END AS indemnite_qualification
    ,
    ...
    FROM dbo.employe
    merci d'avance

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    en sélectionnant toutes les lignes !

    Un SGBD n'interdit pas d'insérer plusieurs lignes en même temps, bien au contraire.

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    en sélectionnant toutes les lignes !

    Un SGBD n'interdit pas d'insérer plusieurs lignes en même temps, bien au contraire.
    Aieeeuuuuu j'ai pas bien compris ta phrase "en sélectionnant toutes les lignes"
    est ce que je n'est pas besoin d'un curseur pour faire ça

    EXPLICATION
    moi ce que je veux j'ai la table employé elle contient les éléments essentiels pour le calcule de la paie parce que il y'a salaire de base et echelon

    chaque mois je veux insérer dans la table indemnités pour tout les fonctionnaires
    j'ai ajouter dans la table indemnités la colonne date sous forme MOIS/ANNEE

  15. #15
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    non, pas besoin de curseur !

    Une requête de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO LaTable (Colonne1, Colonne2, ...)
        SELECT ...
        FROM ...
        ...
    Vous pouvez ainsi insérer directement le résultat du SELECT

  16. #16
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    merci bcp M. Aieeeuuuuu pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] JOIN sur des colonnes de table avec le même nom
    Par Jolt0x dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/08/2010, 21h21
  2. Réponses: 3
    Dernier message: 16/04/2008, 08h39
  3. probleme avec un programme en JS qui realise des calculs
    Par leclone dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/09/2006, 18h09
  4. Réponses: 11
    Dernier message: 30/06/2006, 00h39
  5. Fixer des colonnes de tables
    Par dehbi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/03/2006, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo