0

私は現在、以下のSQLに基づいて、日付ごとの合計労働時間を表示するグラフを持っています。

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

テーブルはこんな感じ。

テーブル

これはすべて正常に機能し、各日付のすべての値のエントリがある限り、グラフが表示されます。そうしないと、日付が失われ、データが同期せずに表示されます。

1つの解決策は、毎週すべてのフィールドのTemp person(AdminUser)に対して0の値を生成するSQLを使用することであると考えていましたが、これは停止しますが、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を返すことを意味します。ANSINULLSの設定を最初に確認する価値があります。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 に答える