XMLElement中的Oracle分析函数

时间:2017-11-16 15:23:11

标签: sql oracle analytical

我正在尝试使用分析函数(如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>

总和和计数功能出现以下错误:

ORA-00937: not a single-group group function

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

2 个答案:

答案 0 :(得分:0)

试试这个:

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;

答案 1 :(得分:0)

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

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

您对amount列进行了总结 - 相反,应该是emp_salary

在XMLATTRIBUTES条款中,您是否还需要显示部门编号?

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

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