2017-07-04 62 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 

      )