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

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

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

4

1 回答 1

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
;

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

于 2014-02-06T18:51:56.763 回答