Sql 如何根据Oracle 11g+中聚合元素的数量改变listag()的结果?

Sql 如何根据Oracle 11g+中聚合元素的数量改变listag()的结果?,sql,oracle,oracle11g,aggregation,listagg,Sql,Oracle,Oracle11g,Aggregation,Listagg,如何根据聚合元素的数量在LISTAGG中打印不同的输出 不需要额外的COUNT*查询,是否可以获取已聚合元素的数量 有一个DDL示例: 创建表牧羊人 牧羊人身份证号码19, SHEPHERD_NAME VARCHAR250 CHAR ; 创建表羊 羊肉, 绵羊的名字叫VARCHAR250 CHAR, 绵羊\牧羊人\身份证号码19 ; -插入牧羊人 在牧羊人中插入值111“亚设”; 在牧羊人的价值观中插入“约瑟夫”; 在牧羊人中插入333“尼哥底母”; -第一个牧羊人是一只羊 在绵羊中插入值“A”

如何根据聚合元素的数量在LISTAGG中打印不同的输出

不需要额外的COUNT*查询,是否可以获取已聚合元素的数量

有一个DDL示例:

创建表牧羊人 牧羊人身份证号码19, SHEPHERD_NAME VARCHAR250 CHAR ; 创建表羊 羊肉, 绵羊的名字叫VARCHAR250 CHAR, 绵羊\牧羊人\身份证号码19 ; -插入牧羊人 在牧羊人中插入值111“亚设”; 在牧羊人的价值观中插入“约瑟夫”; 在牧羊人中插入333“尼哥底母”; -第一个牧羊人是一只羊 在绵羊中插入值“A”、“标记”111; -二牧二羊 在绵羊中插入“A”、“Andres”和“222”值; 在绵羊中插入“B”、“Jeffrey”和“222”值; -三牧羊人三只羊 在绵羊中插入“B”、“Jeffrey”和“333”值; 在绵羊中插入“A”、“Andres”和“333”值; 在绵羊中插入“D”、“Andres”和“333”值; 现在,我想用以下方式显示所有带新行分隔绵羊名称的牧羊人:

选择 你的名字, 选择 listaggSHEEP||ID:'| | SHEEP|U名称,按SHEEP|ID分组顺序中的CHR10 来自绵羊 其中SHEEP\u SHEPHERD\u ID=SHEPHERD\u ID 来自牧羊人; 结果是:

然而,我想为那些只有一只羊的牧羊人隐藏羊的身份证

我尝试了以下方法:

选择 你的名字, 选择 利斯塔格 当COUNT*>1时,则为SHEEP|ID | |':'否则结束 ||绵羊名称,按绵羊ID分组顺序中的CHR10 来自绵羊 其中SHEEP\u SHEPHERD\u ID=SHEPHERD\u ID 来自牧羊人; 但是,我得到一个错误:

ORA-00978:不带分组依据的嵌套分组函数

如果只有一个元素要聚合,是否可以从LISTAGG返回不同的字符串


在Oracle 11g或更高版本中,如何在不降低查询性能的情况下检测聚合元素的数量?

子查询中的条件表达式应该满足您的要求:

SELECT sh.SHEPHERD_NAME, 
        (SELECT (CASE WHEN COUNT(*) = 1 THEN MAX(s.SHEEP_NAME)
                      ELSE LISTAGG(s.SHEEP_ID || ': ' || s.SHEEP_NAME, CHR(10)) WITHIN GROUP (ORDER BY s.SHEEP_ID)
                 END) as SHEEPS
         FROM SHEEPS s
         WHERE s.SHEEP_SHEPHERD_ID = sh.SHEPHERD_ID
       ) as SHEEPS
FROM SHEPHERDS sh;
是一个dbfiddle。

没有子查询的解决方案使用简单的GROUP BY,COUNT*=1来区分sheep COUNT和两个不同的LISTAGG语句

SELECT
  s.SHEPHERD_NAME,
  case when count(*) = 1 then 
   listagg(SHEEP_NAME, CHR(10)) WITHIN GROUP (ORDER BY SHEEP_ID)  
  else 
   listagg(SHEEP_ID || ': ' || SHEEP_NAME, CHR(10)) WITHIN GROUP (ORDER BY SHEEP_ID) end as SHEEPS
FROM SHEPHERDS s
JOIN SHEEPS sh on s.SHEPHERD_ID = sh.SHEEP_SHEPHERD_ID
GROUP BY s.SHEPHERD_NAME /* add SHEPHERD_ID in GROUP BY if the name is not unique */
返回

SHEPHERD_NAME, SHEEPS
Asher          Mark
Joseph         A: Andres
               B: Jeffrey
Nicodemus      A: Andres
               B: Jeffrey
               D: Andres