質問

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 でこれを実現する最も効率的な方法は何でしょうか?必ずストアド プロシージャを使用する必要がありますか?

役に立ちましたか?

解決

これを行うには、ユーザー定義の集計を定義する必要があります。これには 4 つの部分、つまり 4 つの機能があります (検索してください) 集計の作成 の中に IDS 12.10 情報センター):

  1. イニシャライザ(INIT)
  2. イテレーター (ITER)
  3. 結合 (COMBINE)
  4. ファイナライザー(FINAL)

これは大文字の公式用語であり、ある程度直感的です。平均を計算することを考えてください。

  1. イニシャライザ:合計 = 0 を設定します。N = 0
  2. イテレータ:合計 += x を設定します。N++
  3. コンバイナー:合計 = 合計 1 + 合計 2 を設定します。N = N1 + N2 を設定します
  4. ファイナライザ:result = sum / N -- N=0 (ゼロ除算) チェックあり

コンバイナーは、並列実行の中間結果を結合するために使用されます。各並列実行は反復子で開始され、中間結果が生成されます。並列実行が完了すると、個別の値のセットが結合器で結合されます。

ストアド プロシージャ、C または Java UDR を使用して、IDS で同様のコードを作成できます。

SOの質問を参照してください 1 対多の関係を 2 列 — 1 つの一意の行 (ID とカンマ区切りのリスト) として表示します。 Informix に実装された文字列ベースの GROUP_CONCAT() 関数の場合。

他のヒント

これを行うためのInformixには組み込み関数は確かにありません。他の主流のRDBMSは、このような奇妙な集計機能を持っていますか?クエリで選択されていない列で順序付けは少し怪しげですが、グループ化しますか?それは私に新しいものです。

あなたは、このようなデータセットを生成するストアドプロシージャまたはUDRを記述する必要があります。正直に言うと、私は、データベースでこれをしようとしないでしょう。これは、この出力の消費者(すなわちアプリケーション/ Webアプリケーション/レポートライタなど)に最適な作業のように見えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top