Как я могу написать запрос для объединения данных? - PullRequest
2 голосов
/ 12 августа 2011

У меня два запроса.

Первый запрос выглядит так:

SELECT subject_id, period, marks FROM subject_details;

Возвращает следующий набор данных:

subject_id         period       marks
----------         ------       -----
1                   Jan          50
1                   Feb          40
1                   Mar          30
2                   Jan          60

Второй запрос следующий:

SELECT subject.subject_id, periods.month, subject.marks  FROM 
(SELECT subject_id, period, marks FROM subject_details) subject,
(WITH PERIOD_COUNTER AS (
SELECT LEVEL-1 AS ID 
FROM DUAL 
CONNECT BY LEVEL <= 6
) 
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('01/01/2011', 'DD/MM/RRRR'), ID),'Mon') 
month FROM PERIOD_COUNTER) periods 
WHERE subject.period (+) = periods.month;


subject_id         period       marks
----------         ------       -----
1                   Jan          50
1                   Feb          40
1                   Mar          30
2                   Jan          60
null                Apr          null
null                May          null
null                Jun          null

Как я могу написать запрос, который дал бы мне следующий набор результатов (Цель состоит в том, чтобы в основном создать набор результатов, который заполняет данные за пропущенные месяцы для каждого subject_id.):

subject_id         period       marks
----------         ------       -----
1                   Jan          50
1                   Feb          40
1                   Mar          30
1                   Apr          null
1                   May          null
1                   Jun          null
2                   Jan          60
2                   Feb          null
2                   Mar          null
2                   Apr          null
2                   May          null
2                   Jun          null

Ответы [ 3 ]

1 голос
/ 13 августа 2011

Разделенное внешнее объединение позволяет вам присоединиться к 6 subject_id для каждого из 6 месяцев:

with subject_details as
(
    select 1 subject_id, 'Jan' period, 50 marks from dual union all
    select 1 subject_id, 'Feb' period, 40 marks from dual union all
    select 1 subject_id, 'Mar' period, 30 marks from dual union all
    select 2 subject_id, 'Jan' period, 60 marks from dual
)
select subject_details.subject_id, months.period, subject_details.marks
from
(
    select to_char(add_months(date '2011-01-01', level-1), 'Mon') period
    from dual connect by level <= 6
) months
left outer join subject_details
    partition by (subject_id)
    on months.period = subject_details.period
0 голосов
/ 14 августа 2011

Почему бы вам не сделать декартово соединение?

Предположим, у вас также есть таблица "subjets" и таблица "period" (с 6 записями)


SELECT a.subject_id, b.period
  , (select marks FROM subject_details c 
     where c.subject_id=a.subject_id and c.period = b.period
     ) as marks 
from subjects a, periods b

Didnне проверяю.

0 голосов
/ 12 августа 2011

это вызов UNION

SELECT subject_id, period, marks FROM subject_details

UNION

SELECT subject.subject_id, periods.month, subject.marks  FROM 
(SELECT subject_id, period, marks FROM subject_details) subject,
(WITH PERIOD_COUNTER AS (
SELECT LEVEL-1 AS ID 
FROM DUAL 
CONNECT BY LEVEL <= 6
) 
SELECT TO_CHAR(ADD_MONTHS(TO_DATE('01/01/2011', 'DD/MM/RRRR'), ID),'Mon') 
month FROM PERIOD_COUNTER) periods 
WHERE subject.period (+) = periods.month;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...