使用SQLite的透视查询
我有一个数据库和两个需要交互的表。第一个表是一个成员表(使用SQLite的透视查询,sqlite,datetime,Sqlite,Datetime,我有一个数据库和两个需要交互的表。第一个表是一个成员表(login),它有其id(id)、名字(given\u name)和姓氏(family\u name)。第二个表包含ISO 8601字符串中的人员登录或成员id(mid)的打卡时间(dateTimeIn)和打卡时间(dateTimeOut)日期时间,以及他们可以执行的活动类型(type)dateTimeIn和dateTimeOut都是ISO 8601日期时间字段,类型,id,mid,给定的名称和家族名称都是字符串。绑定这两个表的远程外键是h
login
),它有其id(id
)、名字(given\u name
)和姓氏(family\u name
)。第二个表包含ISO 8601字符串中的人员登录或成员id(mid
)的打卡时间(dateTimeIn
)和打卡时间(dateTimeOut
)日期时间,以及他们可以执行的活动类型(type
)dateTimeIn
和dateTimeOut
都是ISO 8601日期时间字段,类型
,id
,mid
,给定的名称
和家族名称
都是字符串。绑定这两个表的远程外键是hours.mid
,它将目录映射到login.id
列
登录
表格:
CREATE TABLE login(id TEXT主键不为NULL、给定名称TEXT不为NULL、family name TEXT不为NULL、lastseen INTEGER不为NULL)
小时数
表格:
创建表小时数(中间文本、键入文本、dateTimeIn整数、dateTimeOut整数)
我正在寻找的是一个查询,它将为我提供以下任何日期范围的表。例如,2013年6月,它应该生产类似的产品。如果我有更多的人登录,那么它也会将他们添加到下面,按姓、名排序
given_name|family_name|Crew|Meeting|Detail|Training
Mark |Tomlin |35 |6 |9 |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 | - | - | - | - | - | -
我确实需要一个查询,该查询将为我提供当前月份内每个人当前所有时间的列表。我是通过以下查询来实现的
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;
现在我只需要做最后一个来显示一年的运行总数。我确实需要一个查询,该查询将为我提供当前月份内每个人当前所有小时的列表。我是通过以下查询来实现的
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;
现在我只需要做最后一个来显示一年的运行总数。
获取每个人所做的小时数
--受他人生活的启发?对不起,我想不起你指的是什么。我想,我现在要删除我的评论,我希望你也这样做。你尝试了什么?您在这些查询的哪一方面有问题?按日期过滤?计算时间间隔?聚合值?排序?首先,我不知道如何旋转一张桌子。所以我现在正在查找这些信息。我不确定一开始该怎么做,甚至不知道这是否可能,但我开始阅读尽可能多的关于SQLite的SQL手册。起初我遇到了一些问题,计算每个成员在一个月内的工作小时数,但我最终通过这个查询解决了这个问题<代码>选择类型和(strftime('%s',dateTimeOut)-strftime('%s',dateTimeIn))作为按类型划分的小时组的时间,mid但现在我需要关注它。了解每个人的工作时间
——受他人生活启发?对不起,我想不起你指的是什么。我想,我现在要删除我的评论,希望你也这么做。你尝试过什么?您在这些查询的哪一方面有问题?按日期过滤?计算时间间隔?聚合值?排序?首先,我不知道如何旋转一张桌子。所以我现在正在查找这些信息。我不确定一开始该怎么做,甚至不知道这是否可能,但我开始阅读尽可能多的关于SQLite的SQL手册。起初我遇到了一些问题,计算每个成员在一个月内的工作小时数,但我最终通过这个查询解决了这个问题<代码>选择类型和(strftime('%s',dateTimeOut)-strftime('%s',dateTimeIn))作为按类型划分的小时组的时间,mid代码>但现在我需要旋转它。