2013-06-28 8 views
1

У меня есть одна база данных с двумя таблицами, с которыми мне нужно взаимодействовать. Первая таблица представляет собой таблицу участников (login), которая имеет свой идентификатор (id), имя (given_name) и фамилию (family_name). Во второй таблице указаны идентификаторы пользователей или идентификатор пользователя (mid), их часы в (dateTimeIn) и часы (dateTimeOut) даты в строке ISO 8601, а также виды активности (type), которые они могут делать. dateTimeIn & dateTimeOut оба ISO 8601 дат и времени полей, type, id, mid, given_name и family_name все строки. Удаленный внешний ключ, который связывает эти две таблицы: hours.mid, который отображает каталог в столбец login.id.pivot-запросы с использованием SQLite

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 

То, что я ищу, это запрос, который даст мне эту таблицу нижеy диапазон дат, который я им даю. Например, за июнь 2013 года он должен произвести что-то вроде этого. Если бы у меня было больше людей в логине, то они также добавили бы их ниже, отсортированные по имени, имени.

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 | - | - | - | - | - | - 
+0

'Получение часов, проведенных каждым человеком, - вдохновленные * жизнью других людей *? – devnull

+0

К сожалению, не удалось вспомнить, о чем идет речь. – devnull

+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; 

Теперь мне просто нужно сделать последнее, чтобы показать текущее общее количество за год.