利用 Sql 實現(xiàn)數(shù)據(jù)透視表功能

講過很多次,數(shù)據(jù)分組和數(shù)據(jù)透視表很像,Sql 中的數(shù)據(jù)分組大家應(yīng)該都很熟悉了,用的就是 group by。數(shù)據(jù)透視表是作為一個數(shù)據(jù)分析師最基本,也是使用頻率最高的一個功能了,我們可以把明細(xì)數(shù)據(jù)從數(shù)據(jù)庫導(dǎo)出來,然后在 Excel 里面做透視表,也可以直接在數(shù)據(jù)庫里面做透視表,然后將透視結(jié)果進(jìn)行導(dǎo)出。這篇我們來看看 Sql 中的數(shù)據(jù)透視表怎么做,這里以 Mysql 數(shù)據(jù)庫為例。
要講怎么在 Sql 中做透視表,我們還是先看看什么是透視表,其實透視表的核心就是按照行列同時分組,然后對分組后的值進(jìn)行某種匯總運(yùn)算。

現(xiàn)在有這么一張表 t,存儲的字段如下:
orderid price date area
S001 10 2019/1/1 A區(qū)
S002 20 2019/1/1 B區(qū)
S003 30 2019/1/1 C區(qū)
S004 40 2019/1/2 A區(qū)
S005 10 2019/1/2 B區(qū)
S006 20 2019/1/2 C區(qū)
S007 30 2019/1/3 A區(qū)
S008 40 2019/1/3 C區(qū)
現(xiàn)在我們想看一下每個區(qū)域每天的訂單量,就是下表這個樣子,我們該怎么做呢?
| A區(qū) | B區(qū) | C區(qū) | |
|---|---|---|---|
| 2019/1/1 | |||
| 2019/1/2 | |||
| 2019/1/3 |
如果要是在 Excel 中做的話就很簡單,直接做一個透視表就ok了,把 date 拖到行那個框,將 area 拖到列那個框,將 orderid 拖到值那個框,然后對 orderid 進(jìn)行計數(shù)運(yùn)算即可。
在 Sql 中,如果我們只是看每一天的訂單量的話是不是只需要直接按照成交日期進(jìn)行 group by 就行,Sql 語句如下:
select
,date
,count(orderid)
from
t
group by date
現(xiàn)在我們想看一下每個區(qū)域每天的一個成交情況,那是不是在上面代碼的基礎(chǔ)上再加一個用來判斷區(qū)域的一個條件,就可以得出每個區(qū)域的情況了。
select
,date
,count(case when area = "A區(qū)" then orderid end) as "A區(qū)"
,count(case when area = "B區(qū)" then orderid end) as "B區(qū)"
,count(case when area = "C區(qū)" then orderid end) as "C區(qū)"
from
t
group by date
最后結(jié)果如下:
A區(qū) B區(qū) C區(qū)
2019/1/1 1 1 1
2019/1/2 1 1 0
2019/1/3 1 1 1
當(dāng)然了,聚合函數(shù)不止可以用 count,還可以用別的聚合函數(shù),比如說,我們想看一下每個區(qū)域每一天的營業(yè)額,就是所有訂單的 price 相加。Sql 代碼如下:
select
,date
,sum(case when area = "A區(qū)" then price else 0 end) as "A區(qū)"
,sum(case when area = "B區(qū)" then price else 0 end) as "B區(qū)"
,sum(case when area = "C區(qū)" then price else 0 end) as "C區(qū)"
from
t
group by date
最后結(jié)果如下:
A區(qū) B區(qū) C區(qū)
2019/1/1 10 20 30
2019/1/2 40 10 20
2019/1/3 30 0 40
以上就是關(guān)于利用 Sql 做數(shù)據(jù)透視表的一個基本講解,用 case when 這種方法雖然可以實現(xiàn)數(shù)據(jù)透視表的功能,但是無論從代碼量還是運(yùn)行速度方面都不是特別理想,如果大家有別的更好的方法,歡迎評論區(qū)一起交流。





