0

我正在尝试对我所做的 listagg 查询中的值求和。

预期的结果应该是这样的

SELECT LEGAL_ENTITY_ID, SUM(0 + 0 + 0 + 1) as Grandtotals
FROM V_VBA_DDCR_MAIN WHERE LEGAL_ENTITY_ID=6012346 AND ROWNUM=1
GROUP BY LEGAL_ENTITY_ID

 |      LEGAL_ENTITY_ID | GRANDTOTALS 
1|    6012346           | 1

我的列表是这样的

SELECT LISTAGG(NVL2(FLDNM,0,1) , '+ ') WITHIN GROUP (ORDER BY FLDNM) FROM LE_MERGE_DDC_MAPPING

此查询的目的是计算一行中空字段的数量。我创建了一个表,其中包含需要检查空值的字段列表。

结果 :

    fld1 + fld2 + fld3 + fld4
=
        0 + 0 + 0 + 1

所以我这样写了我的查询:

SELECT LEGAL_ENTITY_ID, SUM(SELECT LISTAGG(NVL2(FLDNM,0,1) , '+ ') WITHIN GROUP 
(ORDER BY FLDNM) FROM LE_MERGE_DDC_MAPPING) as Grandtotals
FROM V_VBA_DDCR_MAIN WHERE LEGAL_ENTITY_ID=6000132
GROUP BY LEGAL_ENTITY_ID

但是,我收到错误 ORA-00936:缺少表达式。我不确定 Oracle 是否允许您对 listagg 函数求和。任何帮助表示赞赏。

4

2 回答 2

1

您的SELECT LISTAGG(NVL2(FLDNM,0,1) , '+ ')...查询将始终得到字符串 result '0+ 0+ 0+ ...',除非您有为LE_MERGE_DDC_MAPPING空的行。V_VBA_DDCR_MAIN该值与表无关。您可以生成一个包含表达式的字符串:

SELECT LISTAGG('NVL2(' || FLDNM || ' ,0,1)' , '+ ') ...

但这只会给你留下一个包含. 'NVL2(fld1 ,0,1)+ NVL2(fld2 ,0,1)+ ...'您不能对字符串求和,sum()也不能将字符串评估为表达式。您需要根据该字符串生成动态 SQL 语句。

有一种使用 XML 的方法可以做到这一点,但并不完全直观。您可以使用该dbms_xmlgen包创建一个 XML 文档(作为 CLOB),其中包含一个节点,其中 NVL2 结果来自您的实际目标表:

select dbms_xmlgen.getxml('select nvl2(' || fldnm || ',0,1) from v_vba_ddcr_main where legal_entity_id=6012346')
from le_merge_ddc_mapping map;

我不会在这里显示生成的 XML。然后,您可以查询以获取各个值:

select xmlquery('/ROWSET/ROW/*/text()'
  passing xmltype(
    dbms_xmlgen.getxml('select nvl2(' || fldnm || ',0,1) from v_vba_ddcr_main where Legal_Entity_Id=6012346')
  ) 
  returning content)
from le_merge_ddc_mapping;

您可以将它们相加:

select sum(to_number(xmlquery('/ROWSET/ROW/*/text()'
  passing xmltype(
    dbms_xmlgen.getxml('select nvl2(' || fldnm || ',0,1) from v_vba_ddcr_main where legal_entity_id=6012346')
  )
  returning content))) as grandtotals
from le_merge_ddc_mapping;

您建议表之间存在链接,以确定包含哪些字段,因此您需要添加该链接。而且您已经说过有重复项,您需要处理这些重复项 - 最好从您的视图中消除它们,但如果需要,可以使用子查询。不过,这可能是您发展的起点。

于 2016-03-07T10:25:23.713 回答
0

为什么要使用LISTAGG

SELECT LEGAL_ENTITY_ID,
       (
         SELECT COUNT(1)
         FROM   LE_MERGE_DDC_MAPPING
         WHERE  FLDNM IS NULL
       ) as Grandtotals
FROM   V_VBA_DDCR_MAIN
WHERE  LEGAL_ENTITY_ID=6000132;

(由于您要过滤单个LEGAL_ENTITY_ID,因此不需要 final GROUP BY

你确定两个表之间不应该有某种连接条件吗?

于 2016-03-07T10:31:40.250 回答