powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / full outer join
12 сообщений из 12, страница 1 из 1
full outer join
    #39290793
D.U.A.L.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть табличка, где каждая строчка описывает приход или расход.
Операция - это сгруппированные приход(ы) и расход(ы).
Приход может быть без расхода и наоборот (полуоперации).

Вот пример исходной таблицы:
Код: sql
1.
2.
3.
4.
5.
with z as( select 1 n, 1 t, 7 g from dual
    union all select 2, 2, 7 from dual
    union all select 3, 1, 8 from dual
    union all select 4, 2, 9 from dual
    union all select 5, 2, 7 from dual)

тут
N - это id записи
T - 1 - это расход, 2 - это приход
G - id операции (NOT NULL, все записи с одним значением - одна операция)


надо вывести список операций: idОперации | расход(ы) | приход(ы):

запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with z as( select 1 n, 1 t, 7 g from dual
    union all select 2, 2, 7 from dual
    union all select 3, 1, 8 from dual
    union all select 4, 2, 9 from dual
    union all select 5, 2, 7 from dual)
, k as( select distinct g from z )
select k.g, m.n, n.n
from k
    left join z m on (m.g=k.g and m.t=1)
    left join z n on (n.g=k.g and n.t=2)


выдаёт правильный результат.

но таблица z получается очень длинной и если делать промежуточный distinct мне кажется неуместным.
Нельзя ли достичь такого же проще, с одним join?

...думал, full outer join должен мне помочь, но не соображу, как с его помощью получить строки, в которых G 9 и 8.
...
Рейтинг: 0 / 0
full outer join
    #39290803
3.14вот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D.U.A.L.надо вывести список операций: idОперации | расход(ы) | приход(ы):
так и что должно быть в качестве (ы): количество, список через запятую или где?
...
Рейтинг: 0 / 0
full outer join
    #39290816
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D.U.A.L.выдаёт правильный результат.Сомневаюсь.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  6  select g
  7       , listagg(decode(t, 1, n), ',') within group (order by n) as "1"
  8       , listagg(decode(t, 2, n), ',') within group (order by n) as "2"
  9    from z
 10    group by g
 11  ;

         G 1          2
---------- ---------- ----------
         7 1          2,5
         8 3
         9            4
...
Рейтинг: 0 / 0
full outer join
    #39290838
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D.U.A.L.
запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with z as( select 1 n, 1 t, 7 g from dual
    union all select 2, 2, 7 from dual
    union all select 3, 1, 8 from dual
    union all select 4, 2, 9 from dual
    union all select 5, 2, 7 from dual)
, k as( select distinct g from z )
select k.g, m.n, n.n
from k
    left join z m on (m.g=k.g and m.t=1)
    left join z n on (n.g=k.g and n.t=2)


выдаёт правильный результат.

посмотрите сами, что выдаст ваш запрос, если добавить 1 строку
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with z as( select 1 n, 1 t, 7 g from dual
    union all select 2, 2, 7 from dual
    union all select 3, 1, 8 from dual
    union all select 4, 2, 9 from dual
    union all select 5, 2, 7 from dual
    union all select 6, 1, 7 from dual)
, k as( select distinct g from z )
select k.g, m.n, n.n
from k
    left join z m on (m.g=k.g and m.t=1)
    left join z n on (n.g=k.g and n.t=2)


Вас такой перекрёстный подход устроит разве?
...
Рейтинг: 0 / 0
full outer join
    #39290939
D.U.A.L.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EllicСомневаюсь.
Там по операции 7 один расход и два прихода.

Можно считать допустимым, если в этой ситуации приход будет фигурировать два раза:
приход1 - расход2
приход1 - расход5 (в принципе, лучше было бы null-расход2, потому что потом задвоенные приход1 как-то фильтровать придётся), но если это как-то можно в условия объединения запихнуть - совсем хорошо будет.

listagg не пойдёт, потому что в реальности кроме id ещё под 20 полей (даты, текст, ссылки всякие...)
В пример я даже суммы-валюты не пихал, только id.


Я, вроде, разобрался, но не до конца:
начнём сначала: есть наша табличка и join "сама с собой":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with z as( select 1 n, 1 t, 7 g from dual
    union all select 2, 2, 7 from dual
    union all select 3, 1, 8 from dual
    union all select 4, 2, 9 from dual
    union all select 5, 2, 7 from dual)
select *
from z
    full outer join z y on



Если дописать y.g=z.g, то получается ожидаемая групировка по g
Но если дописать y.g=z.g and z.t=1 and y.t=2
то почему-то в левой и правой частях результата появляются ненужные t 2 и 1

По моему разумению уже тут должен быть правильный результат:
ожидаю слева t=1 или NULL, справа - t=2 или NULL.

Однако правильно становится только после доп. фильтрации:
WHERE nvl(z.t, 1)=1 and nvl(y.t, 2)=2

почему "не работает" "and z.t=1 and y.t=2" в объединении?
(Вернее, оно работает, просто я не пойму, как.)


P.S. Они поставили рекапчу, а я не могу её угадать :-)))
может, у меня что-то с куками, но срабатывает она что-то редко.
...
Рейтинг: 0 / 0
full outer join
    #39290945
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D.U.A.L.приход1 - расход2
приход1 - расход5 (в принципе, лучше было бы null-расход2 STFF соединение по порядковому номеру
+ http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM !!!
...
Рейтинг: 0 / 0
full outer join
    #39291702
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Топикстартер спрашивает о том, как использовать GROUP BY по номеру операции и SUM() по приходу и по расходу.
...
Рейтинг: 0 / 0
full outer join
    #39291704
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_SrSUM() по приходу и по расходу.Продолжай. И что будешь суммировать?
...
Рейтинг: 0 / 0
full outer join
    #39291707
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,
Код: plsql
1.
Продолжай. И что будешь суммировать? 



Вот это через case по типу приход/расход:
авторВ пример я даже суммы-валюты не пихал, только id.
...
Рейтинг: 0 / 0
full outer join
    #39291710
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_SrВот это через case по типу приход/расход:
авторВ пример я даже суммы-валюты не пихал, только id.
Это слишком узко. А что ты предлагаешь делать с
D.U.A.L.ещё под 20 полей (даты, текст, ссылки всякие...)
...
Рейтинг: 0 / 0
full outer join
    #39291752
AnSi_Sr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicЭто слишком узко. А что ты предлагаешь делать с
...
ещё под 20 полей (даты, текст, ссылки всякие...)


А это будут следующие посты, "что мне делать с ошибкой ORA-00979: not a GROUP BY expression".
Тогда и посоветуем подумать, что автор хочет получить в итоге выполнения своего запроса.
...
Рейтинг: 0 / 0
full outer join
    #39291771
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnSi_SrА это будут следующие посты, "что мне делать с ошибкой ORA-00979: not a GROUP BY expression".
Тогда и посоветуем подумать, что автор хочет получить в итоге выполнения своего запроса.Если ты заметил, то множество полей появилось как раз в ответ на группировку. А ты алогично упорствуешь, советуя группировку.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / full outer join
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]