分享

Sql 实现数据透视表功能

 L罗乐 2019-06-07
本文转载自公众号:张俊红,作者:张俊红。
https://mp.weixin.qq.com/s/PugnVk28U4W7wIx44X0nwQ 总第148篇/张俊红

讲过很多次,数据分组和数据透视表很像,Sql 中的数据分组大家应该都很熟悉了,用的就是 group by。数据透视表是作为一个数据分析师最基本,也是使用频率最高的一个功能了,我们可以把明细数据从数据库导出来,然后在 Excel 里面做透视表,也可以直接在数据库里面做透视表,然后将透视结果进行导出。这篇我们来看看 Sql 中的数据透视表怎么做,这里以 Mysql 数据库为例。

要讲怎么在 Sql 中做透视表,我们还是先看看什么是透视表,其实透视表的核心就是按照行列同时分组,然后对分组后的值进行某种汇总运算。

现在有这么一张表 t,存储的字段如下:

orderid   price   date       area
S001      10      2019/1/1   A区
S002      20      2019/1/1   B区
S003      30      2019/1/1   C区
S004      40      2019/1/2   A区
S005      10      2019/1/2   B区
S006      20      2019/1/2   C区
S007      30      2019/1/3   A区
S008      40      2019/1/3   C区

现在我们想看一下每个区域每天的订单量,就是下表这个样子,我们该怎么做呢?


A区B区C区
2019/1/1


2019/1/2


2019/1/3


如果要是在 Excel 中做的话就很简单,直接做一个透视表就ok了,把 date 拖到行那个框,将 area 拖到列那个框,将 orderid 拖到值那个框,然后对 orderid 进行计数运算即可。

在 Sql 中,如果我们只是看每一天的订单量的话是不是只需要直接按照成交日期进行 group by 就行,Sql 语句如下:

select
    ,date
    ,count(orderid)
from
    t
group by date

现在我们想看一下每个区域每天的一个成交情况,那是不是在上面代码的基础上再加一个用来判断区域的一个条件,就可以得出每个区域的情况了。

select
    ,date
    ,count(case when area = 'A区' then orderid endas 'A区'
    ,count(case when area = 'B区' then orderid endas 'B区'
    ,count(case when area = 'C区' then orderid endas 'C区'
from
    t
group by date

最后结果如下:

         A区  B区  C区
2019/1/1  1   1    1
2019/1/2  1   1    0
2019/1/3  1   1    1

当然了,聚合函数不止可以用 count,还可以用别的聚合函数,比如说,我们想看一下每个区域每一天的营业额,就是所有订单的 price 相加。Sql 代码如下:

select
    ,date
    ,sum(case when area = 'A区' then price else 0 endas 'A区'
    ,sum(case when area = 'B区' then price else 0  endas 'B区'
    ,sum(case when area = 'C区' then price else 0  endas 'C区'
from
    t
group by date


最后结果如下:

          A区  B区  C区
2019/1/1  10   20   30
2019/1/2  40   10   20
2019/1/3  30   0    40

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多