如何按ID串联所有值(Oracle SQL)?

igetnqfo  于 2023-05-28  发布在  Oracle
关注(0)|答案(1)|浏览(117)

小提琴:https://dbfiddle.uk/A9gQZtUg
我订了1号桌,

其中包含ID、Product和“UniqueProd# On ID”列
“UniqueProd# On ID”显示每个ID的唯一产品计数,计数时将忽略称为“其他”的产品。
但是我想要一个“ProductConcat”列,它将根据“UniqueProd# On ID列“Concat”Product”列的所有值,请参见表2示例:

我想知道是否有一种方法可以使连接的值总是以特定的顺序进行?例如,如果一个ID有苹果、橙子和香蕉,我总是希望将值串联起来,按香蕉、橙子、苹果的顺序排列。

js4nwp54

js4nwp541#

您可以使用LISTAGG函数,但如果不使用ORDER BY子句,则连接乘积的顺序是 * 不确定的 *。所以你需要有一个列来标识你的产品的顺序。您可以创建一个表或使用CTE来让您的 * 特定订单 * 然后与您的表连接,如下所示:

WITH products_order(PRODUCT, p_ord) AS
(
  SELECT 'Bananas' AS PRODUCT, 1 AS p_ord FROM dual UNION ALL
  SELECT 'Oranges' AS PRODUCT, 2 AS p_ord FROM dual UNION ALL
  SELECT 'Apples' AS PRODUCT, 3 AS p_ord FROM dual 
)
SELECT A.ID, A.PRODUCT,
   LISTAGG(DISTINCT CASE WHEN A.PRODUCT <> 'Other' THEN A.PRODUCT END, ', ') 
    WITHIN GROUP (ORDER BY O.p_ord) OVER (PARTITION BY A.ID) AS Product_Concat
FROM Acc A JOIN products_order O
ON A.PRODUCT = O.PRODUCT
ORDER BY A.ID, O.p_ord

Demo

相关问题