首页 > 解决方案 > 从列中选择 min(value) 和 max(value) 并在单行中返回它在 Oracle 中使用 Listagg

问题描述

我有一张如下表

gen_id pos_id Language Value
1221    1234    EN      1.0 m
1221    1234    EN      2.0 m
1221    1234    EN      3.0 m
1221    1234    EN      4.9 m

我想将值选择为:“1.0 m - 4.9 m”。

选择以字符串“-”分隔的 min(value) 和 max(value)。

我尝试了下面的 listagg,但它抛出了错误“ORA-00937:不是单组函数 00937。00000 - “不是单组函数”。

Select  LISTAGG (min(value) || '-' || max(value))   
             WITHIN GROUP (ORDER BY pos_id)
             OVER (PARTITION BY geng_id,pos_id,language)
From TSS_Gen where geng_id = 1221 and Pos_id = 1234;

标签: maxaggregateoracle12cminlistagg

解决方案


首先,不要将数字存储为带单位的字符串;将它们存储为数字。


假设数值然后您不需要使用LISTAGG(或分析函数)并且可以简单地聚合和使用字符串连接:

SELECT min(value) || ' m - ' || max(value) || ' m'
FROM   TSS_Gen
WHERE  geng_id = 1221
AND    Pos_id = 1234;

如果您要存储单位,那么假设它们都是米,那么:

SELECT min(TO_NUMBER(SUBSTR(value, 1, LENGTH(value) - 2))) || ' m'
       || ' - '
       || max(TO_NUMBER(SUBSTR(value, 1, LENGTH(value) - 2))) || ' m'
FROM   TSS_Gen
WHERE  geng_id = 1221
AND    Pos_id = 1234;

推荐阅读