2009-01-28 55 views
2

在Informix的SQL中查找將模擬MySQL的group_concat函數的查詢。informix中的group_concat

MySQL的group_concat所做的是創建組中所有成員的枚舉。

與數據

所以如下:

orderid:itemName:price 
     1:Paper :10 
     1:Pen  :5 
     2:Sugar :15 

和下面的查詢:

select group_concat(itemName), sum(price) 
from order_details 
group by orderid 

會產生:

items :price 
Paper,Pen:15 
Sugar :15 

什麼是最有效的方式來實現這一目標Informix的?我們肯定會使用存儲過程嗎?

回答

3

您將不得不定義一個用戶定義的聚合來執行此操作。這四個部分 - 四大功能(在IDS 12.10 Info Centre搜索CREATE AGGREGATE):

  1. 初始化程序(INIT)
  2. 迭代器(ITER)
  3. 聯合(COMBINE)
  4. 終結(最終)

這是首都的官方術語,它是中等直觀的。考慮計算平均值。

  1. 初始化程序:設置sum = 0; N = 0
  2. Iterator:set sum + = x; N ++
  3. 組合器:集合sum = sum1 + sum2;設定N = N1 + N2
  4. 終結:結果=總和/ N - ,其中n = 0(零除)檢查

組合器被用於從並行執行組合中間結果;每個並行執行都從迭代器開始並生成中間結果。當並行執行完成時,單獨的值集合與組合器。

您可以在IDS中編寫類似代碼 - 使用存儲過程或C或Java UDR。

有關在Informix中實現的基於字符串的GROUP_CONCAT()函數,請參閱SO問題Show a one to many relationship as 2 columns — 1 unique row (ID & comma separated list)

1

Informix當然沒有內置函數來執行此操作。其他主流RDBMS是否有這樣一個奇怪的集合函數?按未在查詢中選擇的列排序有點令人懷疑,但分組?這對我來說是新的。

您將不得不編寫存儲過程或UDR來生成這樣的數據集。說實話,我不會在數據庫中嘗試這個。它看起來像一個最適合這種輸出的消費者的任務(即應用程序/ webapp /報告編寫器等)。

+0

我瞭解Informix沒有內置函數來執行此操作,因此我正在查找可以模擬此行爲的查詢。截至目前,我有一個提供這些信息的存儲過程。 事實上,我沒有發現奇怪的功能,AFAIK SQL標準沒有提到只有數學集合函數應該應用於組。不過,我不知道任何其他支持這種內置函數的RDBMS。 – calvinkrishy 2017-11-09 11:40:56