我正在尝试使用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是动态的。我不知道它们中哪一个存在,哪个不存在,或者根本不存在多少属性。
答案 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
;
报告标题的格式留给读者作为练习。 :)