Oracle关联表用listagg+CASE获取cart id列的SQL查询问题求解
正确查询语句
SELECT a.oi_rowid, b.type, b.name AS item_name, COALESCE( LISTAGG(CASE WHEN b.type = 'CART' THEN b.name END, ',') WITHIN GROUP (ORDER BY b.name) OVER (PARTITION BY a.oi_rowid), 'No Cart ID found' ) AS cart_id FROM order_item a INNER JOIN order_item_xm b ON a.oi_rowid = b.par_rowid;
实现逻辑说明
- 解决重复提示问题:通过
CASE WHEN过滤非CART类型的取值,非CART类型返回NULL,LISTAGG聚合时会自动忽略NULL值,无CART类型时聚合结果为NULL,再通过COALESCE函数统一替换为单次的No Cart ID found文本,不会出现重复拼接的情况。 - 实现同oi_rowid共享cart_id:使用
OVER(PARTITION BY a.oi_rowid)将LISTAGG转为窗口聚合函数,按oi_rowid分区计算聚合结果,同一分区下所有行的计算结果完全一致,不需要按type分组,既保留了所有原始行数据,也实现了同一oi_rowid下cart_id统一的需求。
内容的提问来源于stack exchange,提问作者Arty155
相关产品推荐
相关产品推荐

