1

我正在尝试使用 sum 和 count over partition 等分析函数从 oracle 表中生成 XML。使用以下查询:

SELECT XMLElement("DEPARTMENT", 
            XMLAttributes((sum(amount) OVER (PARTITION BY deptid)) AS dept_sum,
                            (count(*) OVER (PARTITION BY deptid)) AS dept_count),
                XMLAgg(
                    XMLElement("EMPLOYEE", 
                        XMLConcat(XMLElement("EMP_SALARY", a.emp_salary), 
                                     XMLElement("EMP_ADDRESS", a.emp_address))
                    )
                )
         )
   AS "EMP_XML"
FROM EMPLOYEES

期待以下输出

EMP_XML
-------------------------------------------
<DEPARTMENT dept_sum=150, dept_count=2>
    <EMPLOYEE>
        <EMP_SALARY>100</EMP_SALARY>
        <EMP_ADDRESS>Mumbai</EMP_ADDRESS>
    </EMPLOYEE>
    <EMPLOYEE>
        <EMP_SALARY>50</EMP_SALARY>
        <EMP_ADDRESS>Hyderabad</EMP_ADDRESS>
    </EMPLOYEE>
</DEPARTMENT>

sum 和 count 函数出现以下错误:

ORA-00937: not a single-group group function

如何在 XMLElement 函数中使用解析函数?

4

2 回答 2

1

尝试这个 :

SELECT XMLElement("DEPARTMENT", 
            XMLAttributes(sum(emp_salary) AS dept_sum,
                            count(1) AS dept_count),
                XMLAgg(
                    XMLElement("EMPLOYEE", 
                        XMLConcat(XMLElement("EMP_SALARY", emp_salary), 
                                     XMLElement("EMP_ADDRESS", emp_address))
                    )
                )
         )
   AS "EMP_XML"
FROM EMPLOYEES
Group by deptid;
于 2017-11-16T15:56:58.043 回答
0

首先让我们在您的查询中解决一些其他问题:

您正在使用别名a,但您从未定义它。由于您只从一个表中选择,因此您不需要表别名。只写emp_salary而不是a.emp_salary. 但是,如果出于某种原因您仍然坚持使用别名,那么您必须将其用于所有列名,而不仅仅是其中的一些。

你对列求和amount- 应该是emp_salary吗?

在 XMLATTRIBUTES 子句中,您不需要同时显示部门编号吗?

然后,针对您的问题(以及您得到的错误)。您正在使用 XMLAGG,这是正确的 - 以获得正确的文档结构。但这是一个聚合函数——你需要一个 GROUP BY 子句。(显然,group by deptid)。

然后,进入 XMLATTRIBUTES 的是聚合函数。在那个地方你需要sum(emp_salary)count(*)。如果您想将 sum(salary) 和 count(rows) 存储在 XML 文档中的每一行中,您将需要分析函数(就像常规分析函数一样!)这不是您正在做的;您应该在 XMLATTRIBUTES 中使用聚合函数,而不是分析函数。

于 2017-11-16T15:57:32.077 回答