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 :

Création d'une vue sous SQL Server - group by complexe


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Création d'une vue sous SQL Server - group by complexe
    Bonjour,

    Je suis nouveau sur ce forum.
    J'ai besoin d'aide pour créer une vue sous sql server qui me permettra de grouper des enregistrements d'une table. Attention ce groupement est sélectif.
    Le mieux est de vous montrer un exemple :

    Cette vue me permettrait de récupérer la liste des individus avec leur changement de % d'activité.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Mat    N or     Date de but    Date de fin    % activité
    X        1        29/03/1994    05/12/2004    90
    X        1        06/12/2004    26/12/2004    100
    X        1        27/12/2004    09/01/2005    90
    X        1        10/01/2005    16/01/2005    100
    X        1        17/01/2005    30/04/2006    100
    X        1        01/05/2006    31/05/2006    100
    X        1        01/06/2006    30/06/2006    100
    X        1        01/07/2006    01/01/4000    90
    le but est de récuperer quand est ce que le salarié change de % d'activité avec les dates evidemment.
    AInsi je ne veux pas simplement recuperer deux enregistrements mais bien les enregistrements suivants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mat    No r     Date de but    Date de fin    % activité
    X        1        29/03/1994    05/12/2004    90
    X        1        06/12/2004    26/12/2004    100
    X        1        27/12/2004    09/01/2005    90
    X        1        10/01/2005    30/06/2006    100    => soit la date min et la date max pour ce %
    X        1        01/07/2006    01/01/4000    90
    Merci pour vos réponses car je sais le faire sous Oracle mais pas sous SQL server.

    C.

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    comment le feriez-vous sous Oracle ? Ce sera sans doute plus parlant.
    Sur quoi s'opère le regroupement ? Visiblement pas sur le % puisque vous avez plusieurs sorties par % dans votre output final.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Avous de jouer !
    Voici comment je ferais cela.

    Je vous présente mes champs pour que cela soit plus clair.
    SCO_ID_HR : matricule
    SCO_OR_HR_PER : ordinal
    DT_START : date de début
    DT_END : date de fin
    CFR_PERCENT_ACTIV : pourcentage d'acitivité

    ------------------------------------------------------------------------------------

    CREATE OR REPLACE VIEW CFR_VIEW_PCT_ACTIV
    (
    ID_ORGANIZATION,
    SCO_ID_HR,
    SCO_OR_HR_PER,
    DT_START,
    DT_END,
    CFR_PERCENT_ACTIV
    )
    AS
    SELECT '0001', SCO_ID_HR, SCO_OR_HR_PER, MIN(SFR_DT_START) DT_START,
    MAX(SFR_DT_END) DT_END, CFR_PERCENT_ACTIV
    FROM
    (
    SELECT SCO_ID_HR, SCO_OR_HR_PER, SFR_DT_START, SFR_DT_END,
    CFR_PERCENT_ACTIV,
    MAX(RN) OVER (ORDER BY SCO_ID_HR, SCO_OR_HR_PER,
    SFR_DT_START) GROUP_NB
    FROM
    (
    SELECT SCO_ID_HR, SCO_OR_HR_PER, SFR_DT_START, SFR_DT_END,
    CFR_PERCENT_ACTIV,
    CASE WHEN PREV_SCO_ID_HR||PREV_SCO_OR_HR_PER IS NULL
    OR PREV_SCO_ID_HR||PREV_SCO_OR_HR_PER !=
    SCO_ID_HR||SCO_OR_HR_PER
    OR PREV_CFR_PERCENT_ACTIV != CFR_PERCENT_ACTIV
    THEN RN
    END RN
    FROM
    (
    SELECT role.SCO_ID_HR,
    role.SCO_OR_HR_PER,
    sal.SFR_DT_START, sal.SFR_DT_END,
    sal.CFR_PERCENT_ACTIV,
    LAG(role.SCO_ID_HR) OVER (ORDER BY
    role.SCO_ID_HR, role.SCO_OR_HR_PER, sal.SFR_DT_START) PREV_SCO_ID_HR,
    LAG(role.SCO_OR_HR_PER) OVER (ORDER BY
    role.SCO_ID_HR, role.SCO_OR_HR_PER, sal.SFR_DT_START) PREV_SCO_OR_HR_PER,
    LAG(sal.CFR_PERCENT_ACTIV) OVER (ORDER BY
    role.SCO_ID_HR, role.SCO_OR_HR_PER, sal.SFR_DT_START)
    PREV_CFR_PERCENT_ACTIV,
    ROW_NUMBER() OVER (ORDER BY role.SCO_ID_HR,
    role.SCO_OR_HR_PER, sal.SFR_DT_START) RN
    FROM M4SCO_HR_ROLE role, M4SFR_H_HR_SALAIRE sal
    WHERE role.SCO_ID_HR = sal.SFR_ID_HR
    AND role.SCO_OR_HR_ROLE = sal.SFR_OR_HR_ROLE
    AND role.SCO_MAIN_ROLE = 1
    ORDER BY role.SCO_ID_HR, role.SCO_OR_HR_PER,
    sal.SFR_DT_START
    )
    )
    )
    GROUP BY SCO_ID_HR, SCO_OR_HR_PER, CFR_PERCENT_ACTIV, GROUP_NB
    ORDER BY SCO_ID_HR, SCO_OR_HR_PER, DT_START
    /

    voila. mais je ne sais pas le refaire sous SQL server.

    Merci de vos réponses.

    C.

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    QQch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select SCO_ID_HR,SCO_OR_HR_PER,MIN(DT_START),MAX(DT_END)
    FROM M4SCO_HR_ROLE role INNER JOIN M4SFR_H_HR_SALAIRE sal
    ON role.SCO_ID_HR = sal.SFR_ID_HR
    AND role.SCO_OR_HR_ROLE = sal.SFR_OR_HR_ROLE
    WHERE role.SCO_MAIN_ROLE = 1
    GROUP BY SCO_ID_HR, SCO_OR_HR_PER, CFR_PERCENT_ACTIV, GROUP_NB
    ORDER BY SCO_ID_HR, SCO_OR_HR_PER, DT_START

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    effectivement quelque chose du genre mais en plus complexe car une requête comme vous me l'avez décrite ne me ramene que deux enregistrements 100 et 90, hors je désire vraiment un group by selectif qui me ramène tous les enregistrements avec calcul date minimum de date et maximum de date entre chaque changement de % d'activité.

    Mais j'explore votre piste.

    d'ailleurs si j'execute votre requete, il ne comprend pas le group_nb!!

    Merci de votre aide.

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT SCO_OR_HR_PER, SCO_ID_HR,
                DT_START, DT_END, FR_PERCENT_ACTIV
    FROM T_MATABLE
    WHERE SCO_OR_HR_PER=(SELECT MIN(SCO_OR_HR_PER) 
                                             FROM T_MATABLE)
     
    UNION
     
    SELECT T1.SCO_OR_HR_PER, T1.SCO_ID_HR,
                T1.DT_START, T1.DT_END, T1.FR_PERCENT_ACTIV
    FROM T_MATABLE T1 JOIN T_MATABLE  T2
        ON T1.SCO_OR_HR_PER=T2.SCO_OR_HR_PER
    WHERE T1.FR_PERCENT_ACTIV !=T2.FR_PERCENT_ACTIV

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    euh je crois que je me suis mal exprimé car la sentence que tu m'as donné est basé sur la table père, table donnée en exemple.

    Non le but du jeu est d'arriver à réaliser une vue par un select imbriqué sur la même table afin de trouver tous les changements d'activités d'un matricule donné comme dit dans l'exemple.

    ce que j'ai fais sur Oracle correspondait à une demande encore plus complexe puisqu'il me fallait valider avec la période de référence de la table père à la table dont je n'arrive pas à créer cette vue.

    Voila.

    Merci quand même d'avoir essayé de m'aider mais mon problème est moins bloquant maintenant puisque j'ai réalisé un programme qui me permet de le faire et qui me créer une nouvelle table avec les valeurs qui m'interessent.

    C.

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/04/2007, 11h23
  2. Paramètres possibles dans une vue ms sql server
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 30/03/2005, 19h03
  3. tableau dynamique via une table sous sql server
    Par bibi2607 dans le forum ASP
    Réponses: 5
    Dernier message: 21/02/2005, 15h45
  4. Mettre à jour une base sous SQL SERVER 2000
    Par FilipeVV dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/02/2005, 12h24
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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