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

Langage SQL Discussion :

Requête avec récursivité


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    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 bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre régulier
    Inscrit en
    Mai 2009
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 217
    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 bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    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,

    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