Sql 如何根据Oracle 11g+中聚合元素的数量改变listag()的结果?
如何根据聚合元素的数量在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返回不同的字符串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”
在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