0

我目前有一个图表,显示基于以下 SQL 的每个日期的总工作小时数。

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

桌子看起来像这样。

桌子

只要每个日期的每个值都有一个条目,这一切都可以正常工作并显示图表。否则,它会错过日期并且数据显示不同步。

我在想一个解决方案是有一些 SQL 每周为所有字段的临时人员(AdminUser)生成 0 值,这会阻止这种情况,但我不确定这是否是最好的解决方案,因为我的 SQL 相当基本的。或者我应该为每个字段添加一列而不是下面?

这里最好的解决方案是什么?而sql来执行呢?

DN:SQLITE

结构:

结构

唯一索引 - 当日期、名称和项目匹配时更新值而不是添加新值

唯一索引

注意:以下 SQL 用于生成图表的 X 轴 - 日期:

select distinct(date) from resource;

如果有帮助,这就是图表的样子。

图形

4

2 回答 2

1

根据我对您的要求的理解,我将使用 CASE 声明,如下所示:

 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

这就是说,如果小时数大于零,则使用您的公式,否则返回 0。值得首先检查您的 ANSI NULLS 设置。Resource.Hours 必须是整数。

于 2013-03-02T18:32:33.750 回答
1

我认为日历表会对您有很大帮助。

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');

还有一个项目表。

create table projects (
  project_name varchar(16) primary key
);

insert into projects values ('Admin');
insert into projects values ('Absence');
insert into projects values ('Enhancements');

因为 SQLite 在外连接的实现上很吝啬,所以使用视图来使这更容易。

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

现在您可以从该视图中进行选择,并在从表“资源”中引入数据时使用左连接来保留这些行。我插入了一些列,这样你就可以看到发生了什么。

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          
于 2013-03-02T20:35:46.507 回答