背景介绍
Excel的透视是一个非常强大的功能。
假设有以下按照科目、项目、金额整理好的一张普通二维表格。
原始表格
用户可能会希望通过数据透视展现出另外的一种视角的效果。如下图所示:
数据透视表
可以看到实际上就是把原始数据的“项目”维度,提升到列维度上了,同时增加了合计的效果。
效果演示
在数据量较大、Excel单表无法承载的情况下,我们要如何基于数据库做出类似的效果呢?以下是一个可行的方法。语法基于MySQL的语法。
首先我们需要建一张表,假设就叫table_c吧。如下图所示:
承载原始数据的table_c表
接下来,就是见证奇迹的时刻:
类Excel透视效果
原理分析
实际上眼明的小伙伴一眼就看出来底层的原理了。这里还是再贴一下SQL,啰嗦几句。
select
account_code,
sum(case when project_code = 'RD1' then amount else 0 end) as 'RD1',
sum(case when project_code = 'RD2' then amount else 0 end) as 'RD2',
sum(amount) as '总计'
from table_c
group by account_code
with rollup
SQL本身并不复杂核心是以下几点:
- group by的字段,对应的是透视表的行维度,例子中是“account_code”科目。
- case when里面的字段,对应的是透视表的列维度,例子中的是“project_code”项目。
- 里面的那个“amount”金额以及是用sum还是用count还是用其他,以及,对应的是透视表中的值维度以及对应的汇总公式。
- 列上的“总计”需要专门处理一下。
- 行上的“总计”,可以通过MySQL的with rollup实现,缺点是对应的account code值为
,可以二次翻译一下。
第一次写工具文,希望对大家有所帮助,好了,就酱~