0

KornShell (ksh) を使用してピボット テーブル (csv) を作成しようとしています。

これはデータ(csv)です:

name       a1  a2     amount
----------------------------
product1 | 1 | 1000 |  1.5
product1 | 2 | 2000 |  2.6
product1 | 3 | 3000 |  1.2
product1 | 1 | 3000 |  2.1  
product1 | 2 | 3000 |  4.1
product1 | 3 | 2000 |  3.1

結果は次のようになります。

__| a2| 1000 | 2000 | 3000
a1 \----------------------  
1  |    1.5           2.1
2  |           2.6    4.1
3  |           3.1    1.2

2 つの属性でデータを「グループ化」し、それぞれの属性の金額列の合計を含むテーブルを作成したいと考えています。

EDIT : 属性 a1 と a2 は動的です。それらのどれが存在し、どれが存在しないか、または属性がいくつ存在するかはわかりません。

4

1 に答える 1

1

データベースを効果的に使用していないようです。ここに、ある程度の前進を助ける考えがあります: シェルを使用して SQL を生成できます。

各クエリの先頭がどのようになるかはわかっています。

select a1, 

したがって、いくつかのレポート SQL の作成を開始する必要があります。

Report_SQL="select a1, "

次に、ピボット レポート用に任意のサイズの列セットの SQL ステートメントのリストを取得する必要があります (MySQL では、他のデータベースでは||連結が必要になります)。

select distinct concat('sum(case a2 when ', a2, ' then amount else null end) as "_', a2,'",')
  from my_database_table
 order by 1
;

これはシェル内にあるため、次のように簡単に変数に取り込むことができます。

SQL=" select distinct concat('sum(case a2 when ', a2, ' then amount else null end) as _', a2,',') "
SQL+="  from my_database_table "
SQL+=" order by 1 "

# You would have to define a runsql command for your database platform.
a2_columns=$(runsql "$SQL") 

a2_columnsこの時点で、変数の末尾に余分なコンマが追加されます。それは簡単に削除されます:

a2_columns=${a2_columns%,}

これらの変数を連結して、実際に必要と思われるレポート SQL を作成できます。

Report_SQL+="${a2_columns}"
Report_SQL+="  from my_database_table "
Report_SQL+=" group by 1"
Report_SQL+=" order by 1"

結果のレポート SQL は次のようになります。

select a1,  
       sum(case a2 when 1000 then amount else null end) as _1000,
       sum(case a2 when 2000 then amount else null end) as _2000,
       sum(case a2 when 3000 then amount else null end) as _3000
  from my_database_table
 group by 1
 order by 1
;

レポート ヘッダーの書式設定は、読者の課題として残されています。:)

于 2014-02-06T18:51:56.763 に答える