Если вы хотите строку для каждой комбинации person
и eventtype
, которая предлагает CROSS JOIN
. Чтобы получить продолжительность, нам нужно присоединиться к event
, но это должно быть соединение OUTER
, так как не всегда может быть строка. Ваше использование «всего» предполагает, что там может быть более одного event
для данной комбинации person
и event
, поэтому нам также понадобится SUM
.
Выборочные данные:
insert person values (1, 'Joe')
insert person values (2, 'Bob')
insert person values (3, 'Tim')
insert eventtype values (1, 'Cake')
insert eventtype values (2, 'Pie')
insert eventtype values (3, 'Beer')
insert event values (1, 1, 10)
insert event values (1, 2, 10)
insert event values (1, 2, 5)
insert event values (2, 1, 10)
insert event values (2, 2, 7)
insert event values (3, 2, 8)
insert event values (3, 3, 16)
insert event values (1, 1, 10)
Запрос:
SELECT
PET.person_id
, PET.person_name
, PET.eventtype_id
, PET.eventtype_description
, ISNULL(SUM(E.duration), 0) total_duration
FROM
(
SELECT
P.id person_id
, P.name person_name
, ET.id eventtype_id
, ET.description eventtype_description
FROM
person P
CROSS JOIN eventtype ET
) PET
LEFT JOIN event E ON PET.person_id = E.person_id
AND PET.eventtype_id = E.eventtype_id
GROUP BY
PET.person_id
, PET.person_name
, PET.eventtype_id
, PET.eventtype_description
Выход:
person_id person_name eventtype_id eventtype_description total_duration
----------- ----------- ------------ --------------------- --------------
1 Joe 1 Cake 20
1 Joe 2 Pie 15
1 Joe 3 Beer 0
2 Bob 1 Cake 10
2 Bob 2 Pie 7
2 Bob 3 Beer 0
3 Tim 1 Cake 0
3 Tim 2 Pie 8
3 Tim 3 Beer 16
Warning: Null value is eliminated by an aggregate or other SET operation.
(9 row(s) affected)
Это работало отлично, спасибо! – meepmeep
Добро пожаловать. –