Таблица внешнего соединения в Oracle - присоединяйтесь отдельно к каждой дате - PullRequest
0 голосов
/ 01 июня 2018

Предположим, у меня есть некоторые данные и при выполнении запроса, я получил что-то вроде этого -

-----------------------------
trun(date) | location | sum |
-----------------------------
14-June-11 | B        | 5   |
-----------------------------
13-June-11 | B        | 5   |
-----------------------------
14-June-11 | C        | 5   |
-----------------------------
13-June-11 | C        | 5   |
-----------------------------

SELECT TRUNC(DATE_TIME),MIN(LOCATION) AS LOCATION, SUM(CREDIT) AS SUM FROM 
(SELECT * FROM TABLE A
WHERE
 A.DATE_TIME >= TO_DATE('13/JUN/2011','dd/mon/yyyy')
 AND A.DATE_TIME <= TO_DATE('15/JUN/2011','dd/mon/yyyy'))
GROUP BY TRUNC(DATE_TIME), LOCATION 

Есть еще одна таблица B, где есть список местоположений

----
A  |
----
B  |
----
C  |
----

Я хочу что-то вродеthis -

-----------------------------
trun(date) | location | sum |
-----------------------------
14-June-11 | A        | 0   |
-----------------------------
14-June-11 | B        | 5   |
-----------------------------
14-June-11 | C        | 5   |
-----------------------------
13-June-11 | A        | 0   |
-----------------------------
13-June-11 | B        | 5   |
-----------------------------
13-June-11 | C        | 5   |
-----------------------------

Я пытался использовать правильное соединение с таблицей B, но я не могу создать 2 отдельные записи для 14 июня и 13 июня.Любой совет или помощь будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Нет необходимости читать tablea отдельно, чтобы получить различные значения date_time.Вместо этого это работа для часто пропускаемого секционированного внешнего соединения .

. Вот ваш ответ с помощью этой функции.(Таблицы и вставки из ответа Уильяма Робертсона будут работать, чтобы установить это).

select a.date_time
     , b.location
     , coalesce(a.asum,0) as asum
from  ( SELECT trunc(a.date_time) date_time, 
               a.location, 
               sum(a.credit) as asum 
        FROM tablea a 
        WHERE  a.date_time between date '2011-06-13' and date '2011-06-15' or a.date_time is null
        GROUP BY trunc(a.date_time), a.location ) a 
        -- This is the key part here...
        PARTITION BY (date_time)
right join tableb b on a.location = b.location
order by 1 desc, 2;

Что делает ключевое слово PARTITION BY, заставляет внешнее объединение работать отдельно для каждого отдельного значения date_time, создаваяпустые строки внешнего соединения, необходимые для каждой из них.

+-----------+----------+------+
| DATE_TIME | LOCATION | ASUM |
+-----------+----------+------+
| 14-JUN-11 | A        |    0 |
| 14-JUN-11 | B        |    5 |
| 14-JUN-11 | C        |    5 |
| 13-JUN-11 | A        |    0 |
| 13-JUN-11 | B        |    5 |
| 13-JUN-11 | C        |    5 |
+-----------+----------+------+
0 голосов
/ 01 июня 2018

Как насчет этого:

with dates as
     ( select distinct trunc(date_time) as date_time from tablea )
select trunc(d.date_time)
     , b.location
     , coalesce(sum(credit),0) as sum
from   dates d
       cross join tableb b
       left join tablea a
            on  a.location = b.location
            and trunc(a.date_time) = d.date_time
where  a.date_time between date '2011-06-13' and date '2011-06-15' or a.date_time is null
group by d.date_time, b.location
order by 1 desc, 2;

Данные испытаний:

create table tablea
( date_time date
, location varchar2(1)
, credit number(1,0) );

create table tableb(location varchar2(1));

insert into tablea values (date '2011-06-14' + dbms_random.value, 'B', 2);
insert into tablea values (date '2011-06-14' + dbms_random.value, 'B', 3);
insert into tablea values (date '2011-06-14' + dbms_random.value, 'C', 5);

insert into tablea values (date '2011-06-13' + dbms_random.value, 'B', 1);
insert into tablea values (date '2011-06-13' + dbms_random.value, 'B', 2);
insert into tablea values (date '2011-06-13' + dbms_random.value, 'B', 2);

insert into tablea values (date '2011-06-13' + dbms_random.value, 'C', 1);
insert into tablea values (date '2011-06-13' + dbms_random.value, 'C', 2);
insert into tablea values (date '2011-06-13' + dbms_random.value, 'C', 2);

insert into tableb values('A');
insert into tableb values('B');
insert into tableb values('C');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...