2014-02-02 4 views
1

Я пытаюсь построить запрос для друга, и я не уверен на 100%, что мне нужно сделать. Мне нужно рассчитать общее время на человека по группе таблиц.Расчет времени на человека

Установка таблица выглядит примерно так ....

Участник (participant_id)

TableA (participant_id, time1, time2, time3)

TableB (participant_id, time1, time2 , time3)

TableC (participant_id, time1, time2, time3)

Участник может быть или не быть в каждой таблице. Например, участник 1 может иметь запись в таблице A, но не B или C. Также время1, time2 или time3 может быть NULL.

С данным данным, как бы я вычислил общее время на человека по всем столам?

(tableA.time1 + tableA.time2 + tableA.time3) + (tableB.time1 + tableB.time2 + tableB.time3) + (tableC.time1 + tableC.time2 + tableC.time3)

Я использую больше TSQL, чем что-либо, но у вас есть чему поучиться. Спасибо заранее за любого, кто может дать мне несколько полезных советов.

ответ

2

Похоже, вам нужен запрос UNION для UNPIVOT и объединить таблицы, а затем агрегировать над [participant_id], что-то вроде следующего (проверено в Access 2010):

SELECT participant_id, SUM(time_value) AS total_time 
FROM 
    (
     SELECT participant_id, time1 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time1 AS time_value FROM TableB 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableB 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableB 
     UNION ALL 
     SELECT participant_id, time1 AS time_value FROM TableC 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableC 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableC 
    ) AS u 
GROUP BY participant_id 

Edit повторно: комментарий

Если вы «врезался в стену» по количеству пРОФСОЮЗОВ, разрешенных в подзапрос и начать получать «слишком сложный запрос» ошибка, то обходной путь будет

  • создать новую пустую таблицу с именем [TimeValues] с колоннами [participant_id] и [TIME_VALUE]

  • нагрузки на временную таблицу в пакетах с запросами, как этот

INSERT INTO TimeValues (participant_id, time_value) 
SELECT participant_id, time_value FROM 
    (
     SELECT participant_id, time1 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableA 
     UNION ALL 
     SELECT participant_id, time1 AS time_value FROM TableB 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableB 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableB 
    ) AS u 

INSERT INTO TimeValues (participant_id, time_value) 
SELECT participant_id, time_value FROM 
    (
     SELECT participant_id, time1 AS time_value FROM TableC 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableC 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableC 
     UNION ALL 
     SELECT participant_id, time1 AS time_value FROM TableD 
     UNION ALL 
     SELECT participant_id, time2 AS time_value FROM TableD 
     UNION ALL 
     SELECT participant_id, time3 AS time_value FROM TableD 
    ) AS u 
  • затем запустите запрос агрегации во временную таблицу.
+0

К сожалению, доступ не позволяет 'union' в подзапросов. –

+0

@GordonLinoff Да, это так, по крайней мере, в Access 2010. Я просто вставил этот запрос в базу данных Access 2010, и он работал нормально. –

+0

Спасибо. Я узнал что-то полезное. –

0

Вы можете сделать это с помощью left join с и много того, в предложении select:

select p.particpant_id, 
     (nz(a.time1) + nz(a.time2) + nz(a.time3) + 
     nz(b.time1) + nz(b.time2) + nz(b.time3) + 
     . . . 
     )/
     (iif(a.time1 is null, 0, 1) + iff(a.time2 is null, 0, 1) + iif(a.time3 is null, 0, 1) + 
     iif(b.time1 is null, 0, 1) + iff(b.time2 is null, 0, 1) + iif(b.time3 is null, 0, 1) + 
     . . . 
     ) 
from (participant p left join 
     tableA a 
     on p.participant_id = a.participant_id 
    ) left join 
    tableB b 
    on p.participant_id = b.participant_id 
    . . . ; 
Смежные вопросы