4

在 Informix 的 SQL 中查找将模拟 MySQLgroup_concat功能的查询。

MySQLgroup_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 中实现这一目标的最有效方法是什么?我们一定要使用存储过程吗?

4

2 回答 2

4

您必须定义一个用户定义的聚合来执行此操作。这有四个部分 - 四个功能(在IDS 12.10 信息中心搜索CREATE AGGREGATE):

  1. 初始化程序 (INIT)
  2. 迭代器 (ITER)
  3. 结合(结合)
  4. 终结器(最终)

这是大写字母的官方术语,它是适度直观的。考虑计算平均值。

  1. 初始化器:设置 sum = 0; N = 0
  2. 迭代器:set sum += x; N++
  3. 组合器:设置 sum = sum1 + sum2;设置 N = N1 + N2
  4. 终结器:result = sum / N -- N=0(零除)检查

组合器用于组合并行执行的中间结果;每个并行执行都从迭代器开始并生成中间结果。当并行执行完成时,单独的值集与组合器组合。

您可以在 IDS 中编写类似的代码 - 使用存储过程或 C 或 Java UDR。

请参阅 SO 问题Show a one to many relationship as 2 columns — 1 个唯一行(ID 和逗号分隔列表),用于在 Informix 中实现的基于字符串的 GROUP_CONCAT() 函数。

于 2009-01-29T19:23:08.580 回答
0

Informix 中当然没有内置函数来执行此操作。其他主流RDBMS有没有这么奇葩的聚合功能?按查询中未选择的列排序有点可疑,但分组?这对我来说是一个新的。

您必须编写存储过程或 UDR 来生成这样的数据集。老实说,我不会在数据库中尝试这样做。它看起来像是最适合此输出的使用者(即应用程序/webapp/report-writer 等)的任务。

于 2009-01-28T22:22:59.113 回答