Самостоятельное соединение SQL-запросов - PullRequest
4 голосов
/ 29 апреля 2011

Я работаю над запросом для отчета в Oracle 10g.

Мне нужно составить краткий список каждого курса вместе с тем, сколько раз они предлагались в прошлом году (включая те, которые фактически не предлагались).

Я создал один запрос

SELECT coursenumber, count(datestart) AS Offered
FROM class
WHERE datestart BETWEEN (sysdate-365) AND sysdate
GROUP BY coursenumber;

Который производит

COURSENUMBER    OFFERED
----           ----------
ST03              2
PD01              1
AY03              2
TB01              4

Все эти запросы верны. Однако в идеале я хочу, чтобы в левом столбце перечислялись те, что вместе с COURSENUMBER HY и CS, а также 0 или ноль в качестве значения OFFERED. У меня есть ощущение, что это включает в себя какое-то объединение, но пока то, что я пробовал, не дает классов, в которых ничего не предлагается.

Таблица обычно выглядит как

REFERENCE_NO DATESTART TIME TIME        EID     ROOMID COURSENUMBER
------------ --------- ---- ---- ---------- ---------- ----
         256 03-MAR-11 0930 1100          2          2 PD01
         257 03-MAY-11 0930 1100         12          7 PD01
         258 18-MAY-11 1230 0100         12          7 PD01
         259 24-OCT-11 1930 2015          6          2 CS01
         260 17-JUN-11 1130 1300          6          4 CS01
         261 25-MAY-11 1900 2000         13          6 HY01
         262 25-MAY-11 1900 2000         13          6 HY01
         263 04-APR-11 0930 1100         13          5 ST03
         264 13-SEP-11 1930 2100          6          4 ST03
         265 05-NOV-11 1930 2100          6          5 ST03
         266 04-FEB-11 1430 1600          6          5 ST03
         267 02-JAN-11 0630 0700         13          1 TB01
         268 01-FEB-11 0630 0700         13          1 TB01
         269 01-MAR-11 0630 0700         13          1 TB01
         270 01-APR-11 0630 0700         13          1 TB01
         271 01-MAY-11 0630 0700         13          1 TB01
         272 14-MAR-11 0830 0915          4          3 AY03
         273 19-APR-11 0930 1015          4          3 AY03
         274 17-JUN-11 0830 0915         14          3 AY03
         275 14-AUG-09 0930 1015         14          3 AY03
         276 03-MAY-09 0830 0915         14          3 AY03

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011
SELECT
  coursenumber,
  COUNT(CASE WHEN datestart BETWEEN (sysdate-365) AND sysdate THEN 1 END) AS Offered
FROM class
GROUP BY coursenumber;

Итак, как вы видите, эта конкретная проблема не нуждается в объединении.

1 голос
/ 29 апреля 2011

Мне больше нравится ответ jschoen для этого конкретного случая (когда вы хотите одну и только одну строку и столбец из подзапроса для каждой строки основного запроса), но просто для демонстрации другого способа сделать это:

select t1.coursenumber, nvl(t2.cnt,0)
from class t1 left outer join (
 select coursenumber, count(*) cnt
 from class
 where datestart between (sysdate-365) AND sysdate
 group by coursenumber
) t2 on t1.coursenumber = t2.coursenumber
1 голос
/ 29 апреля 2011

Я думаю, что-то вроде этого должно работать для вас, просто делая это как подзапрос.

SELECT distinct c.coursenumber, 
       (SELECT COUNT(*)
        FROM class
        WHERE class.coursenumber = c.coursenumber
          AND datestart BETWEEN (sysdate-365) AND sysdate
        ) AS Offered
FROM class c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...