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

MS SQL Server Discussion :

Requête de regroupement [2008]


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 357
    Points : 417
    Points
    417
    Par défaut Requête de regroupement
    Bonjour,

    Je planche actuellement sur un problème dans l'extraction de données d'absences des salariés de l'entreprise

    Voici le type de données que je souhaite traiter
    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
    NumSalarie    Commentaire    PeriodeDebut    PeriodeFin
    239    Absence maladie    19/10/2012    19/10/2012
    239    Absence RTT H    29/10/2012    29/10/2012
    239    Absence RTT H    02/11/2012    02/11/2012
    239    Absence RTT H    16/11/2012    16/11/2012
    239    Absence maladie    19/11/2012    19/11/2012
    239    Absence maladie    21/11/2012    30/11/2012
    239    Absence maladie    01/12/2012    31/12/2012
    239    Absence maladie    01/01/2013    31/01/2013
    239    Absence maladie    01/02/2013    28/02/2013
    239    Absence maladie    01/03/2013    31/03/2013
    239    Absence maladie    01/04/2013    30/04/2013
    239    Absence congés H    01/05/2013    09/05/2013
    239    Absence RTT H    10/05/2013    10/05/2013
    239    Absence congés H    11/05/2013    19/05/2013
    On peut voir que la personne a une absence maladie du 21/11/12 au 30/04/13

    Comment faire pour obtenir une ligne du 21/11 au 30/04 au lieu des 6 lignes sachant que le 1er jour d'une période suit le dernier d'une autre ?

    En gros, j'aimerai regrouper les absences qui se suivent pour une même nature (commentaire) et pour un même salarié (numsalarie)

    J'espère que vous m'avez compris

    Merci de votre aide

  2. #2
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    allé je me lance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH 
       tree (niveau, id, NumSalarie, Commentaire, PeriodeDebut, PeriodeFin)
       AS (SELECT 0, id, NumSalarie, Commentaire, PeriodeDebut, PeriodeFin FROM   #temp 
    	   UNION ALL
    	   SELECT b.niveau + 1, a.id, a.NumSalarie, a.Commentaire, a.PeriodeDebut, b.PeriodeFin FROM #temp a
    			  INNER JOIN tree b
    					on DATEADD(day, 1, a.PeriodeFin) = b.PeriodeDebut and a.Commentaire = b.Commentaire and a.NumSalarie = b.NumSalarie)
    SELECT NumSalarie, Commentaire, min(PeriodeDebut), PeriodeFin
    FROM (
    	SELECT id, NumSalarie, Commentaire, PeriodeDebut, PeriodeFin, ROW_NUMBER() OVER(PARTITION BY id ORDER BY niveau desc) num 
    	FROM tree
    ) res where num = 1
    group by PeriodeFin, Commentaire, NumSalarie
    *j'ai du rajouter un id a ta table

    il a y peut être moyen de simplifier.

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

    est-ce que ceci vous donne ce que vous attendez ?

    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
     
    ;WITH Debut AS (
    	SELECT *
    	FROM LaTable A
    	WHERE NOT EXISTS(
    		SELECT	1
    		FROM	LaTable B
    		WHERE	B.NumSalarie = A.NumSalarie
    		AND		B.Commentaire = A.Commentaire
    		AND		B.PeriodeFin = DATEADD(DAY, -1, A.PeriodeDebut)
    	)
    )
    , Fin AS (
    	SELECT *
    	FROM LaTable A
    	WHERE NOT EXISTS(
    		SELECT	1
    		FROM	LaTable B
    		WHERE	B.NumSalarie = A.NumSalarie
    		AND		B.Commentaire = A.Commentaire
    		AND		B.PeriodeDebut = DATEADD(DAY, 1, A.PeriodeFin)
    	)
    )
    SELECT 
    	Debut.NumSalarie
    	,Debut.Commentaire
    	,Debut.PeriodeDebut
    	,MIN(Fin.PeriodeFin) AS PeriodeFin
    FROM Debut
    INNER JOIN Fin
    	ON	Debut.NumSalarie = Fin.NumSalarie
    	AND	Debut.Commentaire = Fin.Commentaire
    	AND Fin.PeriodeFin >= Debut.PeriodeDebut
    GROUP BY 
    	Debut.NumSalarie
    	,Debut.Commentaire
    	,Debut.PeriodeDebut

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 357
    Points : 417
    Points
    417
    Par défaut
    Merci aieeeuuuuu c'est impeccable, il me reste plus qu'à comprendre la requête

    Merci aussi Sebwar, j'ai pas testé mais je pense que je vais avoir encore plus de mal à comprendre ta requête

    Et dire que je planche dessus depuis hier...

    Encore merci

  5. #5
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    je crois que je me suis compliqué la vie pour rien la requete de aieeeuuuuu est beaucoup plus simple !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 357
    Points : 417
    Points
    417
    Par défaut
    C'est bien ce qu'il me semblait par contre je voulait en plus faire une somme d'une autre colonne intitulée Nb_Jours mais je n'obtiens pas les résultats souhaités, j'ai essayé SUM(debut.Nb_Jours) mais ce n'est pas bon

    Je pense comprendre la formule, ce n'est pas possible, je vais donc relancer un calcul entre mes 2 dates

  7. #7
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Points : 498
    Points
    498
    Par défaut
    tu peux ajouter une ligne dans le dernier select de la requete d'aieeeuuuuu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
    	Debut.NumSalarie
    	,Debut.Commentaire
    	,Debut.PeriodeDebut
    	,MIN(Fin.PeriodeFin) AS PeriodeFin
    	,DATEDIFF (day , Debut.PeriodeDebut , MIN(Fin.PeriodeFin) ) + 1 AS Nb_Jours

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2008
    Messages : 357
    Points : 417
    Points
    417
    Par défaut
    C'est ce que j'essaye actuellement de faire sauf que je ne fais pas qu'un simple datediff, je retire également les jours fériés, et les weekends

    J'ai déjà une requête "tordue" pour le faire, par contre j'ai pas encore le résultat souhaité

    Si ça ne passe pas, je le ferai via une vue supplémentaire, ça ne sera que la 3ème

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

Discussions similaires

  1. [Requête] [03] Regrouper 2 tables
    Par NiKoTiNe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/04/2007, 10h50
  2. [Requête][97] Regroupment du champs Date
    Par majnoune dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 17/04/2007, 15h32
  3. requête de regroupement
    Par bouba_95 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 08/01/2007, 10h30
  4. [MySQL] Problème de requête de regroupement
    Par zoom61 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/08/2006, 14h43
  5. Requête sql regroupement de dates
    Par rocs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/07/2005, 16h40

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