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

  1. #1
    Membre régulier
    Inscrit en
    mai 2009
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 215
    Points : 103
    Points
    103

    Par défaut Requête avec récursivité

    Bonjour à tous,

    Je dois sortir une liste d'heures à valoriser suite aux pointage des salariés.
    On paye en premier les Heures sup (HSUP) car le plus favorable pour le salarié
    puis on paye les heures majorées, par ordre d'application si il en reste par rapport aux heures sup payées. Il faut à chaque niveau décrémenter le compteur d'heures sup.
    ci dessous ma requête sql de test et d'exemple qui contient les explications. Je sens bien qu'il faut utiliser la récursivité mais, malgré la lecture du tuto de Frédéric Brouard, je ne m'en sors pas ! d'autant qu'il faut décrémenter au fur et à mesure une valeur.

    Je sais pas si mon problème est clairement exposé, à votre disposition pour toute explication nécessaires ...

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    SELECT ID_SALARIE, TYPE, NOMBRE, ORDRE
    INTO #T2
    FROM
    (SELECT 'TOTO' AS ID_SALARIE, 'HSUP' AS TYPE, 2 AS NOMBRE, 0 AS ORDRE
    UNION
    SELECT 'TITI' AS ID_SALARIE, 'HSUP' AS TYPE, 12 AS NOMBRE, 0 AS ORDRE
    UNION
    SELECT 'TOTO' AS ID_SALARIE, 'NUIT' AS TYPE, 12 AS NOMBRE, 1 AS ORDRE
    UNION
    SELECT 'TOTO' AS ID_SALARIE, 'POSTE' AS TYPE, 6 AS NOMBRE, 2 AS ORDRE
    UNION
    SELECT 'TITI' AS ID_SALARIE, 'NUIT' AS TYPE, 5 AS NOMBRE, 1 AS ORDRE
    UNION
    SELECT 'TITI' AS ID_SALARIE, 'POSTE' AS TYPE, 9 AS NOMBRE, 2 AS ORDRE
    UNION
    SELECT 'TITI' AS ID_SALARIE, 'SA' AS TYPE, 4 AS NOMBRE, 3 AS ORDRE
    ) as src
     
     
     
    select * from #T2
     
    --la logique : On paye en premier les Heures sup (HSUP) car le plus favorable pour le salarié
    --puis on paye les heures majorées, par ordre d'application si il en reste par rapport aux heures sup payées. Il faut à chaque niveau décrémenter le compteur d'heures sup
     
    --le resultat que je veux obtenir
    -- TOTO
    ---- HSUP 2
    ---- NUIT 10  (12 - 2 de HSUP)  compteur d'heure sup = 0
    ---- POSTE 6 (en totalité car il ne reste plus d'heure sup)
     
    -- TITI
    ---- HSUP 12
    ---- NUIT 0 (car les 5 de NUIT sont déjà inclus en totalité dans les HSUP)  compteur d'heure sup = 7 (12-5)
    ---- POSTE 2 (9 - 7 car sur les 9, 7 sont pris sur les HSUP restantes 
    ---- SA 4
     
     
    DROP TABLE #T2

  2. #2
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    19 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 003
    Points : 44 655
    Points
    44 655

    Par défaut

    Pas besoin de récursivité. Il faut donner un poids (une priorité) à vos cumuls horaires, puis utiliser une fonction de fenêtrage pour appliquer les majorations.

    Postez le DDL de vos tables et un exemple simple sous forme d'INSERT pour que l'on puisse vous aider.
    https://www.developpez.net/forums/d9...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Membre régulier
    Inscrit en
    mai 2009
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : mai 2009
    Messages : 215
    Points : 103
    Points
    103

    Par défaut

    Merci pour votre réponse,

    Le poids existe déjà, c'est la colonne ORDRE.

    J'ai beau regarder les fonctions de fenetrage sur la doc Microsoft :

    A chaque ligne je dois retrancher le solde d'heures sup. restantes de l'opération de la ligne précédente. je ne vois pas comment faire...

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    19 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 003
    Points : 44 655
    Points
    44 655

    Par défaut

    Faites unes somme cumulée des heures consommées dans le sens de la colonne ordre et retranchez le total.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 213
    Points : 10 782
    Points
    10 782

    Par défaut

    Bonjour,

    ceci doit fonctionner, a bien tester sur les cas limites

    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
     
     WITH Tmp AS (
    	select * 
    			,	SUM(CASE WHEN [TYPE] = 'HSUP' THEN 0 ELSE NOMBRE END) OVER(PARTITION BY ID_SALARIE ORDER BY ORDRE ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS SC
    			,	SUM(CASE WHEN [TYPE] = 'HSUP' THEN NOMBRE END) OVER(PARTITION BY ID_SALARIE) AS HSup
    	from #T2
     )
    SELECT 
    			ID_SALARIE
    		,	TYPE
    		,	NOMBRE
    		,	CASE 
    					WHEN [TYPE] = 'HSUP' THEN NOMBRE
    					WHEN HSup - SC > NOMBRE THEN 0
    					WHEN SC > HSup THEN NOMBRE
    					ELSE NOMBRE - HSup + SC
    			END
    FROM Tmp

Discussions similaires

  1. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  2. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20
  3. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 09h39
  4. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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