Запрос на объединение двух таблиц и использование функции LISTAGG

у меня две таблицы

price
--------

id      value   key
sku1    r1      12  
sku1    r2      13  
sku2    r1      12
sku3    r1      14

specialprice
-----

id      value   key startdate   enddate
sku2    r2      13  20-Mar      20-May
sku3    r1      15  20-Mar      20-May

Я пытаюсь использовать функцию LISTAGG и вывести вывод, например:

output
------
skuid   value
sku1    r1:12,r2:13
sku2    r2:13
sku3    r1:15

Если в таблице specialprice есть запись, а sysdate находится между датой начала и датой окончания, тогда мне нужно учитывать, что в противном случае мне нужно получить значение из таблицы цен. В таблице цен идентификатор может иметь две записи, которые мне нужны для LISTAGG этих двух записей. таблица specialprice может не иметь записи для идентификатора в таблице цен. Поэтому я использую FULL OUTER JOIN

Запрос PFB, который я построил:

SELECT
  a.id,
  listagg (a.value | | ':' | | nvl (a.key, ' '), ',') WITHIN GROUP (ORDER BY a.value) AS price
FROM price a 
FULL OUTER JOIN specialprice b
  ON(b.id = a.id)
WHERE sysdate between b.startdate and b.enddate
GROUP BY a.id

но проблема в том, что я не могу получить значение таблицы specialprice и ключ. Пожалуйста помоги.


person anonymous    schedule 20.04.2016    source источник


Ответы (2)


Попробуй это:

select id, listagg(value) within group(order by value) as price
from (
select
  p.id, 
  case when sp.id is not null and sysdate between sp.startdate and sp.enddate
    then p.value||':'||p.key
    else p.value||':'||p.key
  end as value
from price p
left outer join specialprice sp
  on p.id = sp.id
)
group by id;
person MaxU    schedule 20.04.2016

SELECT a.id,listagg (a.value | | ':' | | nvl (a.key, ' '), ',') 
  WITHIN GROUP (ORDER BY a.value) AS price 
  FROM price a 
  LEFT OUTER JOIN specialprice b 
  ON(b.id = a.id and a.value = b.value and a.key = b.key) 
  WHERE (sysdate between b.startdate and b.enddate OR b.id IS NULL) 
  GROUP BY a.id

На основании объясненного требования, если в b есть совпадающий идентификатор, это должна быть текущая запись. Если найдена не совпадающая запись, все равно необходимо использовать данные a. ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ должно быть достаточно. Надеюсь это поможет.

person ArtBajji    schedule 20.04.2016