【问题标题】:Query to join two tables and to use LISTAGG function查询连接两个表并使用 LISTAGG 函数
【发布时间】:2016-04-20 08:12:31
【问题描述】:

我有两张桌子

价格 -------- 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

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

【问题讨论】:

    标签: oracle listagg


    【解决方案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;
    

    【讨论】:

      【解决方案2】:
      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 就足够了。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 2014-11-07
        • 2016-05-27
        相关资源
        最近更新 更多