2014-05-05 10 views
1

Je fais une application avec PHP/MySQL et j'ai besoin d'obtenir des statistiques annuelles, regroupées par statut.Obtenir des statistiques annuelles

Mais, l'année ne commence pas du 01-01 au 31-12 mais du 01-08 au 31-07.

Le tableau où je reçois des données est comme ceci:

create table Archive (
    id 
    dates (xx-xx-xxxx) 
    statut text 
) 

et les statistiques de table est comme:

create table stats (
    id int, 
    dates text something like (2013-2014) 
    statut, 
) 

I found this query : 

Et je fais ceci:

SELECT *, date_format(dates,'%Y') as date, count(id) as nbId from archive group by statut, date 

mais je ne ne sais pas comment obtenir des statistiques pour 01-08 au 31-07

Désolé pour mon anglais et merci pour votre réponse.

+1

Envisager de fournir DDLs appropriés (et/ou un sqlfiddle) ENSEMBLE AVEC LA RÉSULTAT DÉSIRÉ – Strawberry

Répondre

0

La première étape consiste à créer une table Calendrier dans votre base de données et à l'utiliser dans vos requêtes.

ÉTAPE 1:

Faites une requête MySQL avec des limites de date comme une date arbitraire dans l'avenir (31 décembre 2040) et le début de cette année ou peut-être 2013 (1er janvier 2014)

SELECT datediff('2040-12-31','2014-01-01'); 

Vous aurez besoin de la valeur que cette requête vous donne. Le retour requête ci-dessus 9861.

STEP 2:

Maintenant, créez la table de calendrier réel. Vous aurez besoin de dates non seulement, mais aussi les différents domaines qui peuvent être utilisés pour définir des données supplémentaires associées à chaque date, comme les vacances, week-ends, jours de paie, etc.

CREATE TABLE calendar (
    dt DATE NOT NULL PRIMARY KEY, 
    y SMALLINT NULL, 
    q tinyint NULL, 
    m tinyint NULL, 
    d tinyint NULL, 
    dw tinyint NULL, 
    monthName VARCHAR(9) NULL, 
    dayName VARCHAR(9) NULL, 
    w tinyint NULL, 
    isWeekday BINARY(1) NULL, 
    isHoliday BINARY(1) NULL, 
    holidayDescr VARCHAR(32) NULL, 
    isPayday BINARY(1) NULL 
); 

ÉTAPE 3:

Peupler la table

CREATE TABLE ints (i tinyint); 

INSERT INTO ints VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); 

INSERT INTO calendar (dt) 
SELECT DATE('2010-01-01') + INTERVAL a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i DAY 
FROM ints a JOIN ints b JOIN ints c JOIN ints d JOIN ints e 
WHERE (a.i*10000 + b.i*1000 + c.i*100 + d.i*10 + e.i) <= 9861 #VALUE GOTTEN EARLIER 
ORDER BY 1; 

Fondamentalement, cette table renseigne la valeur dont vous avez besoin. Il y a d'autres choses à faire pour remplir la table avec les valeurs de salaire, vacances, etc.

vous pouvez exécuter une requête comme:

SELECT `count(id)` as `nbid`, `date`, 
    (SELECT COUNT(*) 
    FROM `calendar` 
    WHERE `dt` > `date` 
    ) AS `somethingdate` 
FROM `archives`; 
Questions connexes