質問
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 情報センター):
- イニシャライザ(INIT)
- イテレーター (ITER)
- 結合 (COMBINE)
- ファイナライザー(FINAL)
これは大文字の公式用語であり、ある程度直感的です。平均を計算することを考えてください。
- イニシャライザ:合計 = 0 を設定します。N = 0
- イテレータ:合計 += x を設定します。N++
- コンバイナー:合計 = 合計 1 + 合計 2 を設定します。N = N1 + N2 を設定します
- ファイナライザ:result = sum / N -- N=0 (ゼロ除算) チェックあり
コンバイナーは、並列実行の中間結果を結合するために使用されます。各並列実行は反復子で開始され、中間結果が生成されます。並列実行が完了すると、個別の値のセットが結合器で結合されます。
ストアド プロシージャ、C または Java UDR を使用して、IDS で同様のコードを作成できます。
SOの質問を参照してください 1 対多の関係を 2 列 — 1 つの一意の行 (ID とカンマ区切りのリスト) として表示します。 Informix に実装された文字列ベースの GROUP_CONCAT() 関数の場合。
他のヒント
これを行うためのInformixには組み込み関数は確かにありません。他の主流のRDBMSは、このような奇妙な集計機能を持っていますか?クエリで選択されていない列で順序付けは少し怪しげですが、グループ化しますか?それは私に新しいものです。
あなたは、このようなデータセットを生成するストアドプロシージャまたはUDRを記述する必要があります。正直に言うと、私は、データベースでこれをしようとしないでしょう。これは、この出力の消費者(すなわちアプリケーション/ Webアプリケーション/レポートライタなど)に最適な作業のように見えます。