0

我有两张桌子

价格
--------

id 值键
sku1 r1 12  
sku1 r2 13  
sku2 r1 12
sku3 r1 14

特价
-----

id 值 键 开始日期 结束日期
sku2 r2 13 20-3 月 20-5 月
sku3 r1 15 20-3 月 20-5 月

我正在尝试使用 LISTAGG 函数并带来如下输出:

输出
------
价值
sku1 r1:12,r2:13
sku2 r2:13
sku3 r1:15

如果 specialprice 表中有一个条目并且 sysdate 在 startdate 和 enddate 之间,那么我需要考虑否则我需要从价格表中获取价值。在价格表中,一个 id 可能有两个条目,我需要列出这两个记录。specialprice 表可能没有价格表中的 id 条目。所以我正在使用 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

但问题是我无法获得特价表值和键加入。请帮忙。

4

2 回答 2

1

尝试这个:

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;
于 2016-04-20T08:42:32.220 回答
0
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 中有匹配的 id,则它必须是当前记录。如果没有找到匹配的记录,仍然必须使用 a 的数据。LEFT OUTER JOIN 就足够了。希望这可以帮助。

于 2016-04-20T08:24:28.137 回答