2013-03-02 3 views
0

J'ai actuellement un graphique qui affiche les heures totales travaillées par date en fonction du SQL ci-dessous.Comment générer automatiquement la date (Week End) et 0 valeurs

select sum(hours)/40 from resource where project IN ('Admin', 'Absence','Enhancements') group by date; 

La table ressemble à ceci. tant qu'il ya une entrée pour chaque valeur pour chaque date

tout cela fonctionne et affiche de beaux graphiques. Sinon, il manque des dates et les données sont affichées désynchronisées. Je pensais qu'une solution serait d'avoir un SQL qui générait 0 valeurs pour une personne temporaire (AdminUser) pour tous les champs chaque semaine, ce qui l'arrêterait, mais je ne suis pas sûr si c'est la meilleure solution mon SQL est assez basique. Ou devrais-je ajouter une colonne pour chaque champ au lieu du suivant?

Quelle est la meilleure solution ici? Et le sql pour l'implémenter?

DN: SQLite

Structure:

strcuture

Index unique - Pour mettre à jour la valeur au lieu d'ajouter un nouveau lorsque Date, Nom et match de projet

unique index

Remarque: Le code SQL ci-dessous est utilisé pour générer l'axe X pour le graphique - Dates:

select distinct(date) from resource; 

Voici à quoi ressemble le graphique, si cela peut vous aider.

graph

+0

"heures" est-ce que varchar (16)? –

Répondre

1

Je voudrais utiliser une déclaration de cas basée sur ma compréhension de vos besoins comme suit:

select 
case when sum(hours) > 0 Then 
    CAST(CAST(SUM(hours) as DECIMAL(5,2))/40 AS Decimal(5,2)) 
else 0 end as [hours], 
[DATE] 
from resource group by date 

Cela dit que si les heures est supérieur à zéro puis utilisez votre formule, retour sinon 0 Il est important de vérifier quel est votre paramètre pour ANSI NULLS en premier. Resource.Hours doit être un nombre entier.

+0

Merci pour cela. Je vais essayer. – Rhys

+0

J'ai fait une modification au SQL. S'il vous plaît, jetez un oeil. – w0051977

+0

Le problème est que certaines dates n'existent pas dans la base de données, non? Ou est-ce que je me méprends? – Rudie

1

Je pense qu'une table de calendrier vous aidera beaucoup.

pragma foreign_keys = on; 

create table calendar (
    calendar_date date primary key 
); 

insert into calendar values ('2013-02-01'); 
insert into calendar values ('2013-02-02'); 
insert into calendar values ('2013-02-03'); 
insert into calendar values ('2013-02-04'); 
insert into calendar values ('2013-02-05'); 
insert into calendar values ('2013-02-06'); 
insert into calendar values ('2013-02-07'); 
insert into calendar values ('2013-02-08'); 
insert into calendar values ('2013-02-09'); 
insert into calendar values ('2013-02-10'); 
insert into calendar values ('2013-02-11'); 
insert into calendar values ('2013-02-12'); 
insert into calendar values ('2013-02-13'); 

De plus, une table de projets. Parce que SQLite est avare dans son implémentation des jointures externes, utilisez une vue pour faciliter cette opération.

create view project_dates as 
select c.calendar_date, p.project_name 
from calendar c, projects p; 

Maintenant, vous pouvez choisir de ce point de vue, et d'utiliser une jointure gauche pour préserver les lignes que vous apportez des données de la table « ressource ». J'ai inséré quelques colonnes pour que vous puissiez voir ce qui se passe.

select p.calendar_date, p.project_name, 
     ifnull(sum(r.hours), 0) total_hrs, 
     ifnull(sum(r.hours)/40, 0) divided_hrs 
from project_dates p 
left join resource r 
     on r.date = p.calendar_date 
     and r.project = p.project_name 
where p.calendar_date between '2013-02-03' and '2013-02-10' 
group by p.calendar_date, p.project_name 
order by p.calendar_date, p.project_name; 

calendar_date project_name total_hrs divided_hrs 
-- 
2013-02-03  Absence   0   0   
2013-02-03  Admin   80  2   
2013-02-03  Enhancements 40  1   
2013-02-04  Absence   0   0   
2013-02-04  Admin   0   0   
2013-02-04  Enhancements 0   0   
2013-02-05  Absence   0   0   
2013-02-05  Admin   0   0   
2013-02-05  Enhancements 0   0   
2013-02-06  Absence   0   0   
2013-02-06  Admin   0   0   
2013-02-06  Enhancements 0   0   
2013-02-07  Absence   0   0   
2013-02-07  Admin   0   0   
2013-02-07  Enhancements 0   0   
2013-02-08  Absence   0   0   
2013-02-08  Admin   0   0   
2013-02-08  Enhancements 0   0   
2013-02-09  Absence   0   0   
2013-02-09  Admin   0   0   
2013-02-09  Enhancements 0   0   
2013-02-10  Absence   0   0   
2013-02-10  Admin   0   0   
2013-02-10  Enhancements 30  0   
Questions connexes