听起来您没有尽可能有效地使用数据库。这里有一个想法可以帮助您取得一些进展:您可以使用 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
;
报告标题的格式留给读者作为练习。:)