我正在尝试使用分析函数(如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函数中使用分析函数?
答案 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中使用聚合而不是分析函数。