2017-07-04 63 views
0

我有一个表设置,它为每个列返回多列i.AINp.S_ID,所以我试图聚合这些以获得每行唯一的一行i.AIN记录Oracle SQL:使用Xmlagg选择错误不是单组功能选择使用Xmlagg

我不能使用Listagg,因为我超过了字符数限制。

与本网站的信息,我创建了下面的查询,但我得到以下错误:

"ORA-00937: not a single-group group function" 

有人能告诉我如何改变我的GROUP BY这里,使这项工作或如果我的查询还有其他错误?

我的查询(缩短):

ALTER SESSION ENABLE PARALLEL QUERY; 
SELECT 
    p.S_ID AS ID 
    , XMLELEMENT 
    (
     "AINs", XMLAGG 
     (
      XMLELEMENT 
      (
       "AIN", i.AIN || 
       '-nl-Article: ' || SUBSTR(a.AIN_NAME, 1, 50) || '...' || 
       '-nl-Quantity: ' || SUM(i.UNITS) || 
       '-nl-Price: ' || TO_CHAR(i.PRICE, 'FM9,990.00') || ' + ' || TO_CHAR(i.PRICE_TAX, 'FM9,990.00') || ' USt = ' || TO_CHAR((i.PRICE + i.PRICE_TAX), 'FM9,990.00') || 
       '-nl------' || 
       '-nl-Subtotal: ' || TO_CHAR((i.PRICE * SUM(i.UNITS)), 'FM9,990.00') || ' + ' || TO_CHAR((i.PRICE_TAX * SUM(i.UNITS)), 'FM9,990.00') || ' USt = ' || TO_CHAR(((i.PRICE + i.PRICE_TAX) * SUM(i.UNITS)), 'FM9,990.00') 
      ) 
     ) 
    )/*.EXTRACT('//text()')*/ AS Details 
FROM 
    ITEMS i 
LEFT JOIN 
    AINS a 
    ON i.AIN = a.AIN 
LEFT JOIN 
    PKGS p 
    ON i.SHIPMENT = p.SHIPMENT 
WHERE 
    /*...*/ 
GROUP BY 
    p.S_ID 
    , i.AIN 
    , a.AIN_NAME 
    , i.UNITS 
    , i.PRICE 
    , i.PRICE_TAX 
ORDER BY 
    p.S_ID 

非常感谢任何帮助 - 这是大加赞赏,
迈克

+0

我想你应该向我们展示XML结构,没有它就很难说。 – tukan

回答

1

没有真实的数据和表格,很难提供举一个例子。 你必须将你的聚合分成两个层次。首先,创建内联视图并计算小计,并在下一级汇总结果到一个字符串中。

select xmlagg(.... 
      ) 
      from (
      select i.AIN as ain, SUBSTR(a.AIN_NAME, 1, 50) as ain_name 
       , SUM(i.UNITS) sum_units 
       , TO_CHAR(max(i.PRICE), 'FM9,990.00') || ' + ' || TO_CHAR(max(i.PRICE_TAX), 'FM9,990.00') || ' USt = ' || TO_CHAR((max(i.PRICE) + max(i.PRICE_TAX)), 'FM9,990.00') 
       ... etc 
       from /*joins*/ 
       GROUP BY 
       p.S_ID 
      , i.AIN 
      , a.AIN_NAME 

      )