2008-12-22 9 views
3

Nous avons une table, le nom 'employeeReg' avec des champsObtenir des statistiques horaires en utilisant SQL

employeeNo | employeeName | Registered_on 

Ici Registered_on est un horodatage.

Nous avons besoin d'un modèle horaire d'enregistrements, sur une période de plusieurs jours. par exemple.

01 Jan 08: 12 - 01 h: 1592 inscriptions

01 Jan 08: 01-02 PM: 1020 inscriptions

Quelqu'un peut-il s'il vous plaît suggérer une requête pour cela.


Nous utilisons Oracle 10gR2 comme serveur de base de données.

Répondre

4

Ceci est étroitement liée à, mais légèrement différente de, cette question sur How to get the latest record for each day when there are multiple entries per day. (un point commun avec beaucoup de questions SQL - le nom de la table n'a pas été donné à l'origine!)

La technique de base sera de trouver une fonction qui forme les valeurs de Registered_on variées telles que toutes les entrées dans un heure particulière sont regroupés. Cela peut vraisemblablement être fait avec TO_CHAR() puisque nous traitons avec Oracle (MySQL ne supporte pas cela).

SELECT TO_CHAR(Registered_on, "YYYY-MM-DD HH24") AS TimeSlot, 
     COUNT(*) AS Registrations 
    FROM EmployeeReg 
    GROUP BY 1 
    ORDER BY 1; 

Vous pourriez être en mesure de remplacer les entrées « 1 » par intervalle de temps, ou par l'expression TO_CHAR(); Cependant, pour des raisons de compatibilité descendante, il est probable que cela fonctionne comme écrit (mais je ne peux pas vérifier cela pour vous sur Oracle - un équivalent fonctionne correctement sur IBM Informix Dynamic Server en utilisant EXTEND(Registered_on, YEAR TO HOUR) à la place de TO_CHAR()).

Si vous décidez alors que vous souhaitez que les zéros apparaissent pendant des heures lorsqu'il n'y a pas d'entrées, vous devrez créer une liste de toutes les heures que vous voulez signaler, et vous devrez faire un LEFT OUTER JOIN de cette liste avec le résultat de cette requête. Le plus dur est de générer la bonne liste - différents SGBD ont différentes façons de le faire.

+0

Salut Jonathan, désolé d'avoir manqué ça. Ont donné le nom de la table maintenant. –

+1

NP: C'était une observation tordue basée sur répondre à un bon nombre de questions SQL. J'ai mis à jour la réponse de manière appropriée - j'ai laissé la phrase 'Un point en commun' en place, mais je l'ai mise en italique et ajouté 'à l'origine'. –

2

OBTENUS ce que je voulais, avec :)

SELECT TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24') AS TimeSlot, 
     COUNT(*) AS Registrations 
    FROM EmployeeReg a 
    Group By TO_CHAR(a.registered_on, 'DD-MON-YYYY HH24'); 
Questions connexes