1

対話する必要がある 2 つのテーブルを持つ 1 つのデータベースがあります。最初のテーブルはメンバー テーブル ( login) で、ID ( id)、名 ( given_name)、姓 ( ) がありfamily_nameます。2 番目のテーブルには、ISO 8601 文字列でのログインまたはメンバー ID ( mid) の出勤 ( dateTimeIn) と退勤 ( ) の日付時刻、およびユーザーが実行できるアクティビティの種類 ( ) が保持されます。&は両方とも ISO 8601 日時フィールドであり、 、、、およびすべて文字列です。これら 2 つのテーブルをバインドするリモート外部キーは、ディレクトリを列にマップするものです。dateTimeOuttypedateTimeIndateTimeOuttypeidmidgiven_namefamily_namehours.midlogin.id

loginテーブル:

CREATE TABLE login(id TEXT PRIMARY KEY NOT NULL, given_name TEXT NOT NULL, family_name TEXT NOT NULL, lastseen INTEGER NOT NULL)

id                   |given_name|family_name
-----------------------------------------------
103673125444466670779|Mark      |Tomlin

hoursテーブル:

CREATE TABLE hours(mid TEXT, type TEXT, dateTimeIn INTEGER, dateTimeOut INTEGER)

mid                  |type    |dateTimeIn      |dateTimeOut
-----------------------------------------------------------------
103673125444466670779|Meeting |2013-06-04T20:00|2013-06-04T21:00
103673125444466670779|Meeting |2013-06-10T20:00|2013-06-10T21:00
103673125444466670779|Crew    |2013-06-21T22:00|2013-06-22T13:00
103673125444466670779|Crew    |2013-06-22T23:00|2013-06-23T07:00
103673125444466670779|Training|2013-06-23T20:00|2013-06-23T21:00
103673125444466670779|Crew    |2013-06-29T23:00|2013-06-30T07:00
103673125444466670779|Detail  |2013-06-23T17:00|2013-06-23T19:00
103673125444466670779|Meeting |2013-06-25T14:00|2013-06-25T18:00
103673125444466670779|Detail  |2013-06-28T01:00|2013-06-28T08:00
103673125444466670779|Crew    |2013-06-28T19:00|2013-06-28T23:00

私が探しているのは、指定した日付範囲に対して以下の表を提供するクエリです。たとえば、2013 年 6 月の場合、次のようになります。もっと多くの人がログインしている場合は、姓、名でソートして下に追加します。

given_name|family_name|Crew|Meeting|Detail|Training
Mark      |Tomlin     |35  |6      |9     |1        

もう 1 つのすばらしいクエリは、年ビューを取得できれば、メンバーが追加されるたびに新しい行になります。

given_name|family_name|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec
Mark      |Tomlin     |35 |62 |27 |12 |88 |35 | - | - | - | - | - | -  
4

1 に答える 1

1

今月の全員の現在のすべての時間のリストを取得するクエリが必要でした。次のクエリでそれを行いました。

SELECT
    *
FROM
    hours
WHERE
    dateTimeIn BETWEEN date('now', 'start of month') AND date('now', 'start of month','+1 month','-1 day');

最初に、ピボットの一般的な外観を与える方法を示すクエリを見つけました。そこから、私がやろうとしていたことに役立つオプションが見つかるまで、ハッキングしました。

このクエリは、データベース内の各メンバーの合計を秒数で示します。

SELECT
    m.id,
    m.given_name,
    m.family_name,
    SUM(CASE WHEN h.type = 'Crew' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Crew,
    SUM(CASE WHEN h.type = 'Detail' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Detail,
    SUM(CASE WHEN h.type = 'Meeting' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Meeting,
    SUM(CASE WHEN h.type = 'Training' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Training
FROM login m JOIN hours h ON m.id = h.mid
GROUP BY m.id;

次に、これを拡張して、当月の現在の合計のみを表示することもできます。

SELECT
    m.id,
    m.given_name,
    m.family_name,
    SUM(CASE WHEN h.type = 'Crew' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Crew,
    SUM(CASE WHEN h.type = 'Detail' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Detail,
    SUM(CASE WHEN h.type = 'Meeting' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Meeting,
    SUM(CASE WHEN h.type = 'Training' THEN strftime('%s', h.dateTimeOut) - strftime('%s', h.dateTimeIn) END) Training
FROM login m JOIN hours h ON m.id = h.mid
WHERE
    dateTimeIn BETWEEN date('now', 'start of month') AND date('now', 'start of month', '+1 month', '-1 day')
GROUP BY m.id;

これで、最後の 1 つを実行して、年間の累計を表示する必要があります。

于 2013-06-29T11:15:02.723 に答える