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 :

Requete pour le Taux d'occupation


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut Requete pour le Taux d'occupation
    Bonjour,

    Je souhaite faire un requête qui me donne le taux d'occupation de locaux sur des tranches horaire de 4 heures

    j'ai une base oracle avec une table caractérisée comme ceci :

    NOM | PRENOM | DATE_ENTREE | HEURE_ENTREE | DATE_SORTIE | HEURE_SORTIE
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Et quid de votre post ici ?
    http://www.developpez.net/forums/d81...anche-horaire/

    C'est exactement la même question.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut
    oui je comprends votre réaction normal en faite c'est que je m'étais mal exprimé pour mon dernier post

    je voulais le Nombre d'entrée par tranche horaire que j'ai eut (alors que j'avais dit taux d'occupation)

    Maintenant je voudrais vraiment le taux d'occupation

    l'histoire des tranches d'age j'en fais mon affaire, c'est plus ce que je vais devoir mettre dans mon "where" pour le filtre

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut
    j'ajoute simplement ou j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE
    DATE_ENTREE <= '02/07/2009' AND HEURE_ENTREE > '00:00' AND 
    DATE_SORTIE >= '02/07/2009' AND HEURE_SORTIE < '03:59'
    Mais ça me donne pas les passages que je veux car il n'y a pas les passage long qui sont entré avant 8:00 et après 12:00 et qui sont donc à ajouté dans le cumul après...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si par "taux d'occupation de locaux" vous entendez le nombre de personne à l'interieur, vous pouvez essayer ça :
    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
     
    WITH t AS 
    (
          SELECT 
                to_date('14/09/2009', 'dd/mm/yyyy') + (level - 1) * 1/24 * 4 AS borninf, 
                to_date('14/09/2009', 'dd/mm/yyyy') + (level) * 1/24 * 4 - (1/(24*60*60)) AS bornsup 
          FROM dual
          CONNECT BY level <= (trunc(sysdate) - to_date('14/09/2009'))*24/4
    )
    SELECT 
          t.borninf, 
          t.bornsup,
          entrees.nb_entrees, sorties.nb_sorties,
          sum(coalesce(entrees.nb_entrees,0)-coalesce(sorties.nb_sorties,0)) over (partition by null order by t.borninf) as occupation
    FROM t
    LEFT JOIN
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_entrees
        FROM t
        JOIN presence entree
             ON to_date(entree.date_entree || entree.heure_entree,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) entrees ON t.borninf = entrees.borninf and t.bornsup = entrees.bornsup
    LEFT JOIN	
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_sorties
        FROM t
        JOIN presence sortie
             ON to_date(sortie.date_sortie || sortie.heure_sortie,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) sorties ON t.borninf = sorties.borninf AND t.bornsup = sorties.bornsup
    ORDER BY t.borninf

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut
    J'ai regardé votre requete ça va pas vraiement

    j'ai fait cette requete pour le monment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  DATE_ENTREE, HEURE_ENTREE, DATE_SORTIE, HEURE_SORTIE  FROM MULTICOL
    WHERE 
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') = '10/08/2009' AND HEURE_ENTREE > '00:00' AND 
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') = '10/08/2009' AND HEURE_ENTREE < '03:59'  OR /* Entrée entre 00:00 et 04:00 */ 
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy') = '10/08/2009' AND HEURE_SORTIE < '00:00' AND 
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy') = '10/08/2009' AND HEURE_SORTIE < '03:59'  OR /* Sortie entre 00:00 et 04:00 */
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') < '10/08/2009' AND HEURE_ENTREE > '00:00' AND 
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy')  > '10/08/2009' AND HEURE_SORTIE < '03:59' /* Entrée avant 00:00 et sortie après 04:00 */
    GROUP BY DATE_ENTREE, HEURE_ENTREE, DATE_SORTIE, HEURE_SORTIE
    ORDER BY TO_DATE(DATE_ENTREE ,'dd/mm/yyyy')
    Si on fait la même chose avec chaque critères de 4 heures et qu'on fasse une boucle pour passé toute les dates ça pourrait le faire non ? (je vois pas comment mais bon...)

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si "ca va pas vraiment", un bon début serait que vous exprimiez clairement ce que vous souhaitez obtenir.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut
    D'accord je vais récacapité clairement :

    Je souhaite obtenir le taux d'occupation d'une salle dans une tranche donnée de 4 heures par exemple :

    le taux d'occupation pour moi il faut additionner le nombre de gens qui sont arrivé, ce qui sont partie et ce qui sont arrivé avant et après la tranche horaire. (je me trompe peut être après)

    Pour ensuite faire un graphe du Nb d'entrée superposé avec celui du taux d'occupation (logiquement supérieur dans mon cas)

    La requete devra me donner (la date sera avec l'heure mais j'ai pas la place )

    Date inf | Date inf | Taux occupation | Nb entrée (si possible)
    01/05/2009 0| 01/05/2009 4| 10 | 5
    01/05/2009 4| 01/05/2009 8| 12 | 8
    01/05/2009 8| 01/05/2009 12| 8 | 2

    ....

    C'est plus clair ?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Oui, c'est plus clair, et du coup je vois pas en quoi la requête que je vous ait fournie ne convient pas vraiment.
    Avec un jeu de données :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    WITH t AS 
    (
          SELECT 
                to_date('29/09/2009', 'dd/mm/yyyy') + (level - 1) * 1/24 * 4 AS borninf, 
                to_date('29/09/2009', 'dd/mm/yyyy') + (level) * 1/24 * 4 - (1/(24*60*60)) AS bornsup 
          FROM dual
          CONNECT BY level <= (trunc(sysdate) - to_date('29/09/2009'))*24/4
    ),
    presence as
    (
     select 
     		'29/09/2009' as date_entree, '05:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '08:18:05' as heure_sortie
     from dual
     union all
     select 
     		'30/09/2009' as date_entree, '05:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '08:39:05' as heure_sortie
     from dual
     union all
     select 
     		'30/09/2009' as date_entree, '08:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '08:19:05' as heure_sortie
     from dual
     union all
     select 
     		'30/09/2009' as date_entree, '09:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '10:19:05' as heure_sortie
     from dual
     union all
     select 
     		'30/09/2009' as date_entree, '07:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '13:19:05' as heure_sortie
     from dual
     union all
     select 
     		'01/10/2009' as date_entree, '09:12:05' as heure_entree,
    		'01/10/2009' as date_sortie, '20:19:05' as heure_sortie
     from dual
     union all
     select 
     		'30/09/2009' as date_entree, '06:12:05' as heure_entree,
    		'30/09/2009' as date_sortie, '07:19:05' as heure_sortie
     from dual
    )	
    SELECT 
          t.borninf, 
          t.bornsup,
          coalesce(entrees.nb_entrees,0) as nb_entrees, 
    	  coalesce(sorties.nb_sorties,0) as nb_sorties,
          sum(coalesce(entrees.nb_entrees,0)-coalesce(sorties.nb_sorties,0)) over (partition by null order by t.borninf) as occupation
    FROM t
    LEFT JOIN
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_entrees
        FROM t
        JOIN presence entree
             ON to_date(entree.date_entree || entree.heure_entree,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) entrees ON t.borninf = entrees.borninf and t.bornsup = entrees.bornsup
    LEFT JOIN	
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_sorties
        FROM t
        JOIN presence sortie
             ON to_date(sortie.date_sortie || sortie.heure_sortie,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) sorties ON t.borninf = sorties.borninf AND t.bornsup = sorties.bornsup
    ORDER BY t.borninf

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Points : 85
    Points
    85
    Par défaut
    Dans ta requete je vois bien le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') = '10/07/2009' AND HEURE_ENTREE > '00:00' AND 
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') = '10/07/2009' AND HEURE_ENTREE < '03:59'  OR 
    /* Entrée entre 00:00 et 04:00 */ 
    /* Qui se transforme en : */
    ON TO_DATE(entree.date_entree || entree.heure_entree,'dd/mm/yyyyhh24:mi:ss') 
    BETWEEN t.borninf AND t.bornsup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy') = '10/07/2009' AND HEURE_SORTIE < '00:00' AND 
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy') = '10/07/2009' AND HEURE_SORTIE < '03:59'  OR 
    /* Sortie entre 00:00 et 04:00 */
    /* Qui se transforme en : */
    ON TO_DATE(sortie.date_sortie || sortie.heure_sortie,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TO_DATE(DATE_ENTREE ,'dd/mm/yyyy') < '10/07/2009' AND HEURE_ENTREE > '00:00' AND 
    TO_DATE(DATE_SORTIE ,'dd/mm/yyyy')  > '10/07/2009' AND HEURE_SORTIE < '03:59'
    /* Entrée avant 00:00 et sortie après 04:00 */
    mais là tu mets rien ?
    Alors peut être que je me trompe mais faut bien le prendre en compte non ?

    si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     		'27/09/2009' AS date_entree, '05:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '08:18:05' AS heure_sortie
    il me le rentre pas dans le taux d'occupation pourtant il y a bien une personne présente durant toute la période du 27 au 30, je suis à coté de la plaque (ou pas)

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Dans ce cas, modifiez la date de début de création de vos bornes :
    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
    72
    73
    74
    75
    76
    77
    78
    79
    WITH t AS 
    (
          SELECT 
                to_date('01/09/2009', 'dd/mm/yyyy') + (level - 1) * 1/24 * 4 AS borninf, 
                to_date('01/09/2009', 'dd/mm/yyyy') + (level) * 1/24 * 4 - (1/(24*60*60)) AS bornsup 
          FROM dual
          CONNECT BY level <= (trunc(sysdate) - to_date('01/09/2009'))*24/4
    ),
    presence AS
    (
     SELECT 
     		'29/09/2009' AS date_entree, '05:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '08:18:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'30/09/2009' AS date_entree, '05:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '08:39:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'30/09/2009' AS date_entree, '08:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '08:19:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'30/09/2009' AS date_entree, '09:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '10:19:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'30/09/2009' AS date_entree, '07:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '13:19:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'01/10/2009' AS date_entree, '09:12:05' AS heure_entree,
    		'01/10/2009' AS date_sortie, '20:19:05' AS heure_sortie
     FROM dual
     union ALL
     SELECT 
     		'30/09/2009' AS date_entree, '06:12:05' AS heure_entree,
    		'30/09/2009' AS date_sortie, '07:19:05' AS heure_sortie
     FROM dual
    )	
    SELECT 
          t.borninf, 
          t.bornsup,
          coalesce(entrees.nb_entrees,0) AS nb_entrees, 
    	  coalesce(sorties.nb_sorties,0) AS nb_sorties,
          sum(coalesce(entrees.nb_entrees,0)-coalesce(sorties.nb_sorties,0)) over (partition BY NULL ORDER BY t.borninf) AS occupation
    FROM t
    LEFT JOIN
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_entrees
        FROM t
        JOIN presence entree
             ON to_date(entree.date_entree || entree.heure_entree,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) entrees ON t.borninf = entrees.borninf AND t.bornsup = entrees.bornsup
    LEFT JOIN	
    (
        SELECT 
              t.borninf, 
              t.bornsup,
              count(*) AS nb_sorties
        FROM t
        JOIN presence sortie
             ON to_date(sortie.date_sortie || sortie.heure_sortie,'dd/mm/yyyyhh24:mi:ss') BETWEEN t.borninf AND t.bornsup
        GROUP BY 
              t.borninf, 
              t.bornsup
    ) sorties ON t.borninf = sorties.borninf AND t.bornsup = sorties.bornsup
    ORDER BY t.borninf

Discussions similaires

  1. [AC-2007] Taux d'occupation pour mon hotel
    Par patrick2103 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/01/2013, 17h11
  2. Requete pour un débutant
    Par sqlnoob dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/05/2005, 08h55
  3. requete pour reccuperer une parti d'un resultat
    Par ViBy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/09/2004, 09h33
  4. requete pour avoir CONTENU procedures stockees
    Par bmayer dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 11/02/2004, 13h20
  5. Connaître le taux d'occupation CPU
    Par Thom@s dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 12/11/2003, 23h44

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