【问题标题】:group_concat in InformixInformix 中的 group_concat
【发布时间】:2010-10-04 02:18:41
【问题描述】:

在 Informix 的 SQL 中查找将模拟 MySQL 的 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 中实现这一目标的最有效方法是什么?我们一定要使用存储过程吗?

【问题讨论】:

    标签: sql informix


    【解决方案1】:

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

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

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

    1. 初始化程序:设置总和 = 0; N = 0
    2. 迭代器:设置总和 += x; N++
    3. 组合器:设置 sum = sum1 + sum2;设置 N = N1 + N2
    4. 终结器:结果 = sum / 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)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我了解 Informix 没有执行此操作的内置函数,我正在寻找可以模拟此行为的查询。到目前为止,我有一个提供此信息的存储过程。事实上,我并不觉得这个函数很奇怪,AFAIK SQL 标准没有提到只有数学聚合函数应该应用于组。不过,我不知道有任何其他 RDBMS 支持这种内置功能。
      猜你喜欢
      • 2013-11-21
      • 2013-09-17
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      相关资源
      最近更新 更多