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 :

Statistiques avec les Dates


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut Statistiques avec les Dates
    Bonjour,

    j'ai un gros soucis, ca fais 2 jours que je cherche la solution mais sans succes !

    Alors pour vous expliquer, je cherche a établir des statistiques sur les périodes d’arrêt ( en Nb de jours ) lors d'une maladie pro et ceux en fonction de l'année.

    Voilà ma table


    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
    CREATE TABLE [dbo].[Tmaladies_professionnelles] (
    [id_maladies_professionelles] int IDENTITY(1, 1) NOT NULL,
    [id_MP_nom] int NULL,
    [MP_date] smalldatetime NULL,
    [id_MP_nature] tinyint NULL,
    [MP_taux_IPP] tinyint NULL,
    [MP_date_IPP] smalldatetime NULL,
    [MP_taux_IPP_revise] tinyint NULL,
    [MP_date_IPP_revise] smalldatetime NULL,
    [MP_date_IPP_rejet] smalldatetime NULL,
    [createur] varchar(25) NULL,
    [date_creation] datetime NULL)
    ON [PRIMARY]
    WITH (DATA_COMPRESSION = NONE);
    GO
    ALTER TABLE [dbo].[Tmaladies_professionnelles] SET (LOCK_ESCALATION = TABLE);
    GO
    plusieurs champs ne doit pas etre prise en compte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE [dbo].[TAT_MP_arret] (
    [id_MP_arret] int IDENTITY(1, 1) NOT NULL,
    [id_MP] int NULL,
    [MP_date_debut] smalldatetime NULL,
    [MP_date_reprise] smalldatetime NULL,
    [MP_nb_jours] int NULL,
    [id_MP_type_arret] tinyint NULL)
    ON [PRIMARY]
    WITH (DATA_COMPRESSION = NONE);
    GO
    ALTER TABLE [dbo].[TAT_MP_arret] SET (LOCK_ESCALATION = TABLE);
    GO
    id_MP_arret	id_MP	MP_date_debut	MP_date_reprise	MP_nb_jours	id_MP_type_arret
    3	18	28/06/2013 00:00	03/04/2014 00:00	279	10
    2	17	12/12/2014 00:00	12/02/2015 00:00	62	10
    4	18	06/06/2014 00:00	12/01/2015 00:00	220	20
    9	21	30/04/2012 00:00	30/05/2016 00:00	1491	10
    5	19	15/02/2015 00:00	29/03/2015 00:00	42	10
    6	19	01/04/2015 00:00	02/06/2015 00:00	62	20
    7	19	06/06/2015 00:00	30/09/2015 00:00	116	30
    8	20	01/05/2013 00:00	05/02/2016 00:00	1010	10

    et j'aimerai avoir comme resultat celui ci :

    id_mp   |   Annee  |  Nb Jours
    ----------------------------------
    21        | 2012      | 245
    21        | 2013      | 365
    21        | 2014      | 365
    21        | 2015      | 365
    21        | 2016      | 150
    20        | 2013      | 244
    20        | 2014      | 365
    20        | 2015      | 365
    20        | 2016      | 35
    
    et la liste des périodes :

    id_mp = 21 [ 30/04/2012 à 30/05/2016 ]
    id_mp = 20 [ 01/05/2013 à 05/02/2016 ]


    et voici mes premiere requetes :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    /****** PERIODE DE LA DATE DEBUT JUSKA FIN DE L'ANNEE EN COURS****************/
     
    SELECT mp_date [DateMP],
        YEAR(dbo.TAT_MP_arret.MP_date_debut)+1 [AnneeDebutArret], 
        DATEDIFF(day,'01/01/' + CONVERT(varchar,YEAR(MP_date_reprise)),MP_date_reprise) [DiffDate],
        MP_nb_jours [ NbJoursArretTotal],
        MP_date_debut,MP_date_reprise
     
     
        FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
     
     
        WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
        AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
        AND YEAR(dbo.TAT_MP_arret.MP_date_reprise) > YEAR(dbo.TAT_MP_arret.MP_date_debut)
     
     
     
    /*** PERIODE SUR LA MEME ANNEE*****************************************/
     
    SELECT mp_date [DateMP],
        YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
        MP_nb_jours [ NbJoursArretTotal],
        MP_date_debut,MP_date_reprise
     
     
        FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
     
     
        WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
        AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
        AND YEAR(dbo.TAT_MP_arret.MP_date_reprise) = YEAR(dbo.TAT_MP_arret.MP_date_debut)
     
     
    /****** PERIODE DU DEBUT DE L'ANNEE JUSQUA DATE REPRISE****************/
     
    SELECT mp_date [DateMP],
        YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
        DATEDIFF(day,MP_date_debut,'31/12/' + CONVERT(varchar,YEAR(MP_date_debut))) [DiffDate],
        MP_nb_jours [ NbJoursArretTotal],
        MP_date_debut,MP_date_reprise
     
     
        FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
     
     
        WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
        AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
        AND YEAR(dbo.TAT_MP_arret.MP_date_debut) < YEAR(dbo.TAT_MP_arret.MP_date_reprise)
     
     
     
    /**** REQUETE SUR PLUSIEURS DE 2 ANNEES */
     
    SELECT mp_date [DateMP],
        YEAR(dbo.TAT_MP_arret.MP_date_debut) [AnneeDebutArret], 
        DATEDIFF(day,MP_date_debut,'31/12/' + CONVERT(varchar,YEAR(MP_date_debut))) [DiffDate1],
        DATEDIFF(day,'01/01/' + CONVERT(varchar,YEAR(MP_date_reprise)),MP_date_reprise) [DiffDate2],
        MP_nb_jours [ NbJoursArretTotal],
        DATEDIFF(year,MP_date_debut,MP_date_reprise) * 365
        MP_date_debut,MP_date_reprise,
        (DATEDIFF(year,MP_date_debut,MP_date_reprise) - 1) *365
     
     
        FROM dbo.Tmaladies_professionnelles,TAT_MP_arret
     
     
        WHERE dbo.Tmaladies_professionnelles.id_maladies_professionelles = dbo.TAT_MP_arret.id_MP
        AND YEAR(dbo.TAT_MP_arret.MP_date_debut) >= YEAR(SYSDATETIME())-5
        AND DATEDIFF(year,MP_date_debut,MP_date_reprise) > 2


    J'ai une requête qui permet d'avoir le nombre de jours pour l'année ou la période d’arrêt a commencer et a fini ( donc 2 année ) mais si la période s’étale sur plus de 2 ans , au milieu je n'ai pas le détail des jours par année et c'est ça le problème.

    Voilà c'est dans le cas ou les période d’arrêt s’étale sur plusieurs année, j'ai déjà des requêtes pour les périodes d’arrêt pour les autres cas ( période d’arrêt sur la même année, et se chevauchant sur 2 année ) que je recouperai en fonction de l’année par un LEFT JOIN et je devrai avoir des chiffres correctes je pense par la suite !!

    je sais bien que les tables sontmal conçu mais c'est le programme sur lequel je travaille je peux pas faire autrement...

    Avez vous une idée ???

    MERCI pour VOTRE AIDE
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

  2. #2
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    Conformément aux règles de postage du forum, merci de poster les ddl de tes tables ainsi que ta requête. un jeu de données serait un plus.
    Là on a aucune idée des type de données utilisés...
    Par contre, Je peux déjà te dire qu'à vue de nez ton modèle n'est pas bon.
    mp_date_debut ok, après il te faut soit une durée soit une date de fin, mais pas les 2. il ne faut pas de redondance dans une base de données.
    dès que tu postes tes scripts ddl et ta requete, on pourra t'aider plus précisément.
    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  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,

    Avec un jeu d'essai on comprendrais mieux la situation.

    Je pense qu'une table calendrier vous aiderait à résoudre votre problème

  4. #4
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Une Table Calendrier qui contiendra les annees pour faire un LEFT JOIN apres ??
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  3. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  4. Pb avec les dates < année 2000
    Par elitost dans le forum Oracle
    Réponses: 2
    Dernier message: 15/09/2004, 12h37
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

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