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 :

Taux d'occupation par tranche horaire


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut Taux d'occupation par tranche horaire
    Bonjour,

    Bonjour je souhaiterai transformer ma requête ORACLE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DATEJ, COUNT(DATEJ) AS DATE_ENTREE   FROM PRESENCE
    WHERE DATEJ BETWEEN '02/09/2009' AND '22/09/2009' 
    GROUP BY DATEJ
    en tranche horaire de 4 heures à l'aide du champ "HEURE"

    Car je vois pas trop comment utiliser les betweens...

    Merci d'avance

  2. #2
    Membre émérite
    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
    Par défaut
    Bonjour,

    Une description de la table et un extrait des données seraient bienvenus.
    Ce que vous souhaitez obtenir également, car votre explication est un peu sommaire.

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Pour générer les tranches de 4 heures, tu peux gruger.
    La clause hiérarchique CONNECT BY peut être utilisée abusivement pour générer des lignes à la volée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT to_date('02/09/2009', 'dd/mm/yyyy') + (level - 1) * 1/24 * 4 as borninf, to_date('02/09/2009', 'dd/mm/yyyy') + (level) * 1/24 * 4 as bornsub 
    FROM dual
    CONNECT BY level <= LeNombreDeTranchesHorairesDe4HeuresEntreTesDeuxDatesQueJaiLaFlemmeDexprimerMaisTuPeuxLeDeduireAPartirDeTestDeuxBornes
    Ca te crée des intervalles de 4 heures consécutifs.
    Maintenant, tu fais la jointure avec ta table : cela te permet d'associer toutes les lignes de ta table qui sont entre les deux dates à une tranche de 4 heures. Après quoi tu groupes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH t AS (
    SELECT to_date('02/09/2009', 'dd/mm/yyyy') + (level - 1) * 1/24 * 4 as borninf, to_date('02/09/2009', 'dd/mm/yyyy') + (level) * 1/24 * 4 as bornsub 
    FROM dual
    CONNECT BY level <= LeNombreDeTranchesHorairesDe4HeuresEntreTesDeuxDatesQueJaiLaFlemmeDexprimerMaisTuPeuxLeDeduireAPartirDeTestDeuxBornes 
    )
    SELECT t.borninf, t.bornsup, count(*)
    FROM t 
      JOIN TaTable a ON a.TaDate BETWEEN t.borninf AND t.bornsup
    GROUP by t.borninf, t.bornsup
    Tu vois le principe ?

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    Bonjour,

    Ma requete affiche ça :

    Row# DATE
    1 02/09/2009 111
    2 03/07/2009 122
    3 03/08/2009 118
    .... etc...

    et je voudrais avoir :

    1 02/09/2009 | 0:00 | 3:59 | 70
    2 02/09/2009 | 4:00 | 7:59 | 30
    3 02/09/2009 | 8:00 | 11:59 | 11
    ...


    J'ai repris la réponse et j'ai modifié avec mes champs mais je bloque sur une partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN PRESENCE a ON a.TaDate BETWEEN t.borninf AND t.bornsup
    code complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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 AS bornsub 
     FROM dual
     CONNECT BY LEVEL <= 42
     )
       SELECT t.borninf, t.bornsup, COUNT(*)
       FROM t 
       JOIN PRESENCE a ON a.TaDate BETWEEN t.borninf AND t.bornsup
       GROUP BY t.borninf, t.bornsup

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    J'ai avancé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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 AS bornsup 
     FROM dual
     CONNECT BY LEVEL <= 4
      )
      SELECT t.borninf, t.bornsup, COUNT(*)
      FROM t 
      JOIN PRESENCE a ON a.DATEJ BETWEEN t.borninf AND t.bornsup
      GROUP BY t.borninf, t.bornsup
    Résultat :

    Row# BORNINF BORNSUP COUNT(*)

    1 14/09/2009 14/09/2009 04:00:00 126


    ça commence mais je voudrais les tranches maintenant...

    merci de votre aide

  6. #6
    Membre émérite
    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
    Par défaut
    Ton problème vient sans doute du fait que tu as le jour et l'heure dans deux colonnes différentes.
    Utilise les deux pour en faire une date complète avant de la comparer aux bornes.

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    Zut c'est le genre de truc que je maitrise pas

    en gros c'est à ce niveau qu'il faut que je change quelques choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN PRESENCE a ON a.DATEJ

    ???

    en tout cas merci déjà des info que vous m'avez donnés

  8. #8
    Membre émérite
    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
    Par défaut
    Il serait bien de connaitre les type de chacune des colonnes de vos tables et un exemple des données qui s'y trouvent, mais en reprenant le travail de Pacmann ça pourrait ressembler à ç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
    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 
          to_char(t.borninf,'dd/mm/yyyy') as jour, 
          to_char(t.borninf,'hh24:mi:ss') as heure_debut, 
          to_char(t.bornsup,'hh24:mi:ss') as heure_fin, 
          count(*) as nb_ligne
    from t
    join presence p
         ON to_date(p.datej || p.heure,'dd/mm/yyyyhh24:mi:ss') between t.borninf and t.bornsup
    GROUP BY to_char(t.borninf,'dd/mm/yyyy'), to_char(t.borninf,'hh24:mi:ss'), to_char(t.bornsup,'hh24:mi:ss')
    order by to_char(t.borninf,'dd/mm/yyyy'), to_char(t.borninf,'hh24:mi:ss'), to_char(t.bornsup,'hh24:mi:ss')

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    Parfait ça marche

    je vais vérifier les données à présent

    Merci encore

  10. #10
    Membre émérite
    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
    Par défaut
    Par contre, si vous avez la possibilité, évitez d'utiliser une colonne pour le jour et une autre pour l'heure, et habituez vous plutôt aux opérations sur les dates.

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    merci pour l'information

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 328
    Par défaut
    y a t'il un moyen de faire en sorte que le résultat de la colonne date arrive format date ou du moins classé par date car la ça donne :

    01/08/2009
    01/09/2009
    02/08/2009
    02/09/2009
    ....

    merci d'avance

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il suffit de changer le order by, faites un petit effort je suis sûr que vous pouvez le faire seul, car vous décrivez exactement ce qu'il faut faire.

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

Discussions similaires

  1. requête par tranche horaire et par jour
    Par lieselotte dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/05/2009, 12h57
  2. Réponses: 1
    Dernier message: 26/03/2009, 19h43
  3. Calcul d'heures par tranche horaire
    Par A0080 dans le forum Excel
    Réponses: 11
    Dernier message: 05/03/2008, 14h19
  4. regroupement par tranche horaire
    Par Tiresia dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/06/2007, 10h50
  5. Récupérer des enregistrements par tranche horaire
    Par olive_le_malin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/05/2006, 16h53

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