Использование:
SELECT x.team_id,
x.year,
COALESCE(COUNT(e.event_id), 0) AS events
FROM (SELECT :start_year + LEVEL - 1 AS year,
t.team_id
FROM DUAL, TEAM t
CONNECT BY :start_year + LEVEL - 1 <= :end_year) x
LEFT JOIN EVENT e ON EXTRACT(YEAR FROM e.start_date_time) = x.year
AND e.team_id = x.team_id
Это создаст список лет, но вы должны установить переменные :start_year
и :end_year
BIND.
Ранее:
SELECT x.team_id,
x.year,
COALESCE(COUNT(e.event_id), 0) AS events
FROM (SELECT 2006 AS year,
a.team_id
FROM TEAM a
UNION ALL
SELECT 2007,
b.team_id
FROM TEAM b) x
LEFT JOIN EVENT e ON EXTRACT(YEAR FROM e.start_date_time) = x.year
AND e.team_id = x.team_id
TO_CHAR в порядке, чтобы получить год, но возвращает его в виде CHAR (4), поэтому вам нужно использовать TO_NUMBER(TO_CHAR(date_col, 'yyyy'))
, чтобы получить число.Поэтому я использовал EXTRACT вместо ...