使用SQLite进行透视查询

时间:2013-06-28 14:56:08

标签: sqlite datetime

我有一个数据库,包含两个需要与之交互的表。第一个表是成员表({{​​1}}),其ID(login),名字(id)和姓氏(given_name)。第二个表将人员登录或成员ID(family_name)的时钟(mid)和时钟输出(dateTimeIn)日期时间保存在ISO 8601字符串中,以及活动类型(dateTimeOut)他们可以做。 type& dateTimeIn是ISO 8601日期时间字段,dateTimeOuttypeidmidgiven_name都是字符串。绑定这两个表的远程外键是family_name,它将目录映射到hours.mid列。

login.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)

我正在寻找的是一个查询,它会在下面给出我提供给它的任何日期范围。例如,对于2013年6月,它应该产生这样的东西。如果我有更多的人登录,那么它也会在下面添加它们,按姓氏,名字排序。

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

另一个令人敬畏的查询是,如果我可以获得一年视图,添加的每个成员都会成为新行。

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

1 个答案:

答案 0 :(得分: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;

现在我只需要做最后一个来显示今年的总计。

相关问题