用SQL实现类Excel透视效果

背景介绍

Excel的透视是一个非常强大的功能 。
假设有以下按照科目、项目、金额整理好的一张普通二维表格 。
用SQL实现类Excel透视效果

原始表格
用户可能会希望通过数据透视展现出另外的一种视角的效果 。如下图所示:
用SQL实现类Excel透视效果

数据透视表
可以看到实际上就是把原始数据的“项目”维度,提升到列维度上了,同时增加了合计的效果 。

效果演示

在数据量较大、Excel单表无法承载的情况下,我们要如何基于数据库做出类似的效果呢?以下是一个可行的方法 。语法基于MySQL的语法 。
首先我们需要建一张表,假设就叫table_c吧 。如下图所示:


用SQL实现类Excel透视效果

承载原始数据的table_c表
接下来,就是见证奇迹的时刻:


用SQL实现类Excel透视效果

类Excel透视效果

原理分析

实际上眼明的小伙伴一眼就看出来底层的原理了 。这里还是再贴一下SQL,啰嗦几句 。
selectaccount_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_cgroup by account_codewith rollup
SQL本身并不复杂核心是以下几点:
  1. group by的字段,对应的是透视表的行维度,例子中是“account_code”科目 。
  2. case when里面的字段,对应的是透视表的列维度 , 例子中的是“project_code”项目 。
  3. 里面的那个“amount”金额以及是用sum还是用count还是用其他 , 以及,对应的是透视表中的值维度以及对应的汇总公式 。
  4. 列上的“总计”需要专门处理一下 。
  5. 行上的“总计”,可以通过MySQL的with rollup实现 , 缺点是对应的account code值为,可以二次翻译一下 。


【用SQL实现类Excel透视效果】第一次写工具文,希望对大家有所帮助,好了,就酱~

相关经验推荐