Oracle SELECT: количество событий на команду и в год - PullRequest
1 голос
/ 03 сентября 2010

Как сказано в названии, я хочу выбрать количество событий на команду и в год.Оператор select ниже работает нормально, но не дает мне именно то, что я ищу.

SELECT
 Team.team_id,
 TO_CHAR(Event.START_DATE_TIME, 'yyyy') AS year,
 count(event_id)    AS events
FROM
 Team
LEFT OUTER JOIN
 Event ON Event.team_id = Team.team_id
GROUP BY
 TO_CHAR(Event.START_DATE_TIME, 'yyyy'),
 team_id
ORDER BY
 year  ASC,
 team_id  ASC
;

С этим, если у нас есть:

Team 1 : 1 event in 2006
Team 2 : 1 event in 2007

Мы получаем:

ID | Year | Events
------------------
1  | 2006 | 1
2  | 2007 | 1

И я хотел бы получить:

ID | Year | Events
-------------------
1  | 2006 | 1
2  | 2006 | 0
1  | 2007 | 0
2  | 2007 | 1

Я не знаю, как изменить мой запрос для этого.

Ответы [ 3 ]

2 голосов
/ 03 сентября 2010

Использование:

   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 вместо ...

1 голос
/ 03 сентября 2010

Так это работает! :) Вот мой последний запрос:

SELECT
 Team.name,
 Years.year,
 count(Event.event_id)
FROM
    Team
JOIN
    (
        SELECT DISTINCT EXTRACT(YEAR FROM start_date_time) AS year
        FROM Event
    ) Years ON 1 = 1
LEFT OUTER JOIN
    Event ON    Event.team_id = Team.team_id
                AND EXTRACT(YEAR FROM Event.start_date_time) = Years.year
WHERE
    event_type = 'C'
GROUP BY
    Team.name,
    Years.year
ORDER BY
    Year ASC,
    name ASC
;

Спасибо!

1 голос
/ 03 сентября 2010

У меня нет Oracle для тестирования, но в целом это должно работать:

SELECT
 Team.team_id,
 Years.year,
 COALESCE(count(Event.event_id),0) events
FROM
 Team
   JOIN (SELECT DISTINCT EXTRACT(YEAR FROM start_date_time) year FROM Event) Years ON 1=1
   LEFT OUTER JOIN Event ON Event.team_id = Team.team_id AND EXTRACT(YEAR FROM Event.start_date_time) = Years.year
GROUP BY
 Years.year,
 team_id
ORDER BY
 year  ASC,
 team_id  ASC
;

Вы будете получать результаты за каждый год, когда у вас есть событие в событиях. Если этого недостаточно, вы можете заменить подпункт Годы на таблицу, заполненную всеми годами.

...