Wenn Sie eine Zeile für jede Kombination von person
und eventtype
möchten, schlägt das eine CROSS JOIN
vor. Um die Dauer zu erhalten, müssen wir uns an event
anschließen, aber das muss ein OUTER
Join sein, da es nicht immer eine Zeile gibt. Ihre Verwendung von "total" deutet darauf hin, dass dort mehr als eine event
für eine gegebene Kombination von person
und event
sein könnte, also brauchen wir auch eine SUM
darin.
Beispieldaten:
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)
Die Abfrage:
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
Ausgang:
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)
Das funktionierte perfekt, danke! – meepmeep
Gern geschehen. –