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 :

Création d'un taux d'absentéisme en sql server


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 20
    Par défaut Création d'un taux d'absentéisme en sql server
    Bonjour

    J'ai une table qui contient les données d'absence (vacation) avec un type d'absence (Planifié, non planifié) , la date et le temps d'absence.

    Je veux créer une requête qui retourne la date, le type et le taux d'absentéisme grouper par date et par date,

    La requête que j'ai utiliser est comme ci-dessous mais ça marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',SUM(v.time) 'VacationTime',(SUM(v.time)/(vac.Totalvacation))  'Rate' 
    from vacation v 
    join time_code tc on tc.code=v.code,
    (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 
    where v1.date BETWEEN '2016-08-20' AND '2016-08-30' group by v1.date) vac ,
    where v.date BETWEEN '2016-08-20' AND '2016-08-30' GROUP BY v.date,tc.type,vac.Totalvacation


    Merci pour votre soutient.
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Citation Envoyé par sabermekni Voir le message
    La requête que j'ai utiliser est comme ci-dessous mais ça marche pas.
    "ça marche pas" n'est pas un message d'erreur et ne décrit pas le résultat obtenu.
    Un peu plus de détail serait le bienvenu.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre émérite

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 817
    Billets dans le blog
    2
    Par défaut
    une proposition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',(convert(numeric(5,2),SUM(v.time))/(Select convert(numeric(5,2),SUM(v.time))  from vacation v)) * 100 'Rate' 
    from vacation v 
    join time_code tc on tc.code=v.code,
    (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 
    where v1.date BETWEEN '2016-08-20' AND '2016-08-30' group by v1.date) vac ,
    where v.date BETWEEN '2016-08-20' AND '2016-08-30' GROUP BY v.date,tc.type,vac.Totalvacation

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 20
    Par défaut
    Ci-dessous c'est ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',SUM(v.time) 'Time',vac.Totalvacation 'Vacation',op.Totalworktime 'Worktime',SUM(v.time)/vac.Totalvacation 'Rate' 
    from vacation v 
    join time_code tc on tc.code=v.code,
    (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 where v1.date BETWEEN '2016-08-20' AND '2016-08-30' group by v1.date) vac,
    (select distinct(op.date),SUM(op.normal_time) 'Totalworktime' from operator_card op where op.date BETWEEN '2016-08-20' AND '2016-08-30' group by op.date) op
     
     
    where v.date BETWEEN '2016-08-20' AND '2016-08-30' and vac.date = v.date and op.date = v.date GROUP BY v.date,tc.type,vac.Totalvacation,op.Totalworktime
    Et celle ci c'est le resultat de retour
    Images attachées Images attachées  

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 20
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    "ça marche pas" n'est pas un message d'erreur et ne décrit pas le résultat obtenu.
    Un peu plus de détail serait le bienvenu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     
    select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',SUM(v.time) 'Time',vac.Totalvacation 'Vacation',op.Totalworktime 'Worktime',SUM(v.time)/vac.Totalvacation 'Rate' 
    from vacation v 
    join time_code tc on tc.code=v.code,
    (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 where v1.date BETWEEN '2016-08-20' AND '2016-08-30' group by v1.date) vac,
    (select distinct(op.date),SUM(op.normal_time) 'Totalworktime' from operator_card op where op.date BETWEEN '2016-08-20' AND '2016-08-30' group by op.date) op
     
     
    where v.date BETWEEN '2016-08-20' AND '2016-08-30' and vac.date = v.date and op.date = v.date GROUP BY v.date,tc.type,vac.Totalvacation,op.Totalworktime
    Et ci-dessous le résultat de retour
    Images attachées Images attachées  

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Je ne peux pas voir les images depuis mon poste de travail.
    Qu'y a-t-il à voir ? Quel est le résultat obtenu et pourquoi est-il erroné ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 20
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Je ne peux pas voir les images depuis mon poste de travail.
    Qu'y a-t-il à voir ? Quel est le résultat obtenu et pourquoi est-il erroné ?
    Le résultat de la division obtenu c'est toujours zéro alors qu'elle doit être autres que 0 malgré que la formule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',SUM(v.time) 'Time',vac.Totalvacation 'Vacation',op.Totalworktime 'Worktime',(SUM(v.time)/op.Totalworktime)*100 'Rate' 
    from vacation v 
    join time_code tc on tc.code=v.code,
    (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 where v1.date BETWEEN '2016-08-20' AND '2016-08-30' group by v1.date) vac,
    (select distinct(op.date),SUM(op.normal_time) 'Totalworktime' from operator_card op where op.date BETWEEN '2016-08-20' AND '2016-08-30' group by op.date) op
     
     
    where v.date BETWEEN '2016-08-20' AND '2016-08-30' and vac.date = v.date and op.date = v.date GROUP BY v.date,tc.type,vac.Totalvacation,op.Totalworktime

    Résultat

    Date type Time vacation Worktime Rate
    22/08/2016 Planned 187505 223505 620690 0
    22/08/2016 Unplanned 36000 223505 620690 0
    23/08/2016 Planned 51720 84840 746640 0
    23/08/2016 Unplanned 33120 84840 746640 0
    24/08/2016 Planned 72060 97980 759260 0
    24/08/2016 Unplanned 25920 97980 759260 0
    25/08/2016 Planned 62745 82425 766385 0
    25/08/2016 Unplanned 19680 82425 766385 0

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Est-ce que ce ne serait pas simplement une question de typage du résultat de l'opération ? Ou simplement d'affichage ?
    Que se passe-t-il avec l'expression SUM(v.time) / op.Totalworktime * 100.00 ? (Je n'ai pas de SQL Server sous la main pour tester)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par sabermekni Voir le message
    Le résultat de la division obtenu c'est toujours zéro alors qu'elle doit être autres que 0 malgré que la formule.
    Un piège classique de la division. Dans ta formule, tu utilises la division entière et non la division classique. Du coup, ton résultat est entier. Et comme ton dividende est toujours plus petit que le diviseur... tu obtiens 0.

    Tu as deux possibilités :
    • ou bien tu convertis tes nombres en nombre à virgule (flottant, fixe, à toi de choisir) et tu effectues ensuite la division ;
    • ou bien tu mets ton facteur x100 au plus proche de ton dividende, de sorte à diviser 100 * SUM(v.time) par op.Totalworktime.


    Sachant qu'en plus les deux ne sont pas interchangeables. Si tu optes pour la seconde option, tu auras toujours un résultat entier (par exemple 95, mais impossible d'avoir 95.3). Tandis qu'avec la première, tu auras un nombre décimal.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 20
    Par défaut
    En fait j'ai trouver une autre solution ailleurs sur le net. Merci tous le monde pour votre support.

    Mon objectif c'est de créer un Graphique de type Spline qui montre le flux du taux d'absentéisme durant une période.

    J'ai bien voulu vous partagé la solution qui permet vous aider un jour.

    Ceci est le code en Vb.net:
    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
     
     
    Try
                conn = New SqlConnection()
                Dim dtTest As DataTable = New DataTable
                conn = connexion()
                dtTest.Columns.Add("Time", GetType(Integer))
                dtTest.Columns.Add("Date", GetType(String))
                dtTest.Columns.Add("Type", GetType(String))
                Dim x As DataTable = get_totlavacation(from_date, to_date)
     
                sql = "select distinct(CONVERT(varchar,v.date,103)) 'Date',tc.type 'Type',SUM(v.time) 'Time',vac.Totalvacation 'Vacation',op.Totalworktime 'Worktime'  from vacation v join time_code tc on tc.code=v.code, (select v1.date,SUM(v1.time) 'Totalvacation' from vacation v1 where v1.date BETWEEN '" & from_date & "' AND '" & to_date & "' group by v1.date) vac, (select distinct(op.date),SUM(op.normal_time) 'Totalworktime' from operator_card op where op.date BETWEEN '" & from_date & "' AND '" & to_date & "' group by op.date) op where v.date BETWEEN '" & from_date & "' AND '" & to_date & "' and vac.date = v.date and op.date = v.date GROUP BY v.date,tc.type,vac.Totalvacation,op.Totalworktime"
                Dim cmd As SqlCommand = New SqlCommand(sql, conn)
                Dim reader As SqlDataReader = cmd.ExecuteReader
                While reader.Read
                    Dim y As Decimal = (reader.GetValue(2) / (reader.GetValue(3) + reader.GetValue(4))) * 100.0
     
                    dtTest.Rows.Add(y, reader.GetValue(0), reader.GetValue(1))
                End While
                Dim dv As DataView = New DataView(dtTest)
                dv.Sort = "Date asc"
                Chart1.Series.Clear()  'this is just to remove the default Series in a 
                'VB.NET chart; you may not need this
                Chart1.DataManipulator.FilterSetEmptyPoints = True 'Points that match filter will be marked as empty
                Chart1.DataManipulator.FilterMatchedPoints = True  'Filter points that match Filter criteria
                Chart1.DataBindCrossTable(dv, "Type", "Date", "Time", "Label=Time")
                For Each cs As Series In Chart1.Series
                    Chart1.DataManipulator.Filter(DataVisualization.Charting.CompareMethod.EqualTo, 0, cs)   'Compare if equal to zero
                    cs.ChartType = SeriesChartType.Spline
                    cs.XValueType = ChartValueType.Date
                    ' cs.CustomProperties = "DrawingStyle=cylinder"
                    cs.BorderWidth = 3
                    Dim dpcp As DataPointCustomProperties = New DataPointCustomProperties
                Next
                conn.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    Merci
    Images attachées Images attachées  

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

Discussions similaires

  1. Création d'un plan de maitenance sous SQL SERVER 2005 EXPRESS
    Par matimat2k4 dans le forum Développement
    Réponses: 1
    Dernier message: 26/10/2009, 23h44
  2. Création d'un point de terminaison avec sql server 2005
    Par mliliya14 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 03/05/2009, 21h24
  3. création d'une table de fait sous sql server 2005
    Par kev0631 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 19/07/2007, 15h45
  4. création de cube olap , analysis manager et sql server 2000
    Par kev0631 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/07/2007, 16h55
  5. [SQL Server ou MSDE] [Créations de tables]
    Par penchu dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 11/05/2007, 13h38

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