使用KornShell创建数据透视表

时间:2013-10-08 12:42:18

标签: shell csv ksh pivot-table

我正在尝试使用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

我想通过两个属性“分组”数据并创建一个表,其中包含各个属性的amount列的总和。

编辑:属性a1和a2是动态的。我不知道它们中哪一个存在,哪个不存在,或者根本不存在多少属性。

1 个答案:

答案 0 :(得分:1)

听起来你没有尽可能有效地使用数据库。这是一个帮助您取得一些进展的想法:您可以使用shell生成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
;

因为这是在shell中,所以很容易将其拉入变量,如下所示:

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
;

报告标题的格式留给读者作为练习。 :)