我有两张桌子
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在startdate和enddate之间,那么我需要考虑,否则我需要从价格表中获取价值。 在价格表中,id可能有两个条目,我需要LISTAGG这两个记录。 特价价格表可能没有价格表中的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
但问题是我无法获得specialprice表值和密钥加入。 请帮忙。
答案 0 :(得分: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;
答案 1 :(得分: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,则它必须是当前记录。如果找不到匹配记录,则仍必须使用数据。 LEFT OUTER JOIN就足够了。希望这会有所帮助。