表注释
字段 描述 id 主键 date 日期 product 产品 channel 渠道 amount 销售额表数据
思考如果你看到這裏請稍稍思考下,一開篇我説過我們的數據是按 日期|产品|渠道|销售额 這樣按行存儲的,以上截圖大家一看就懂,然後再看看開篇的報表截圖,我想大家可以同我一樣可以分析出以下幾點:
報表縱向看大致分三部分一部分是前一日產品銷售明細 然後一部分是前一日產品渠道產品合計 最後一部分是按渠道做的月統計
報表橫向看大致分兩部分一部分是前一日的數據 另一部分則是月份匯總數據
最後一部分則是所有渠道的產品合計、日合計、月合計
好了,問題來了,如何做呢,我是這麽想的:首先要很清楚的是你的sql大致分兩大部分(兩個子查詢)
一部分是前一日的數據另一部分則是月份匯總數據
最後需要將兩部分數據做聯表查詢,這樣太贊了,似乎完成了報表的80%,至於最後一行的求總,這裏先賣個關子哈~
第一部分數據(前一日的數據)
我想我們立馬能做的第一部分sql恐怕就是行專列吧(似乎這是最容易實現的😄)
sql似乎沒什麽問題,但是我們少了一列,對那就是按渠道日合計,當然如果您對postgresql窗口函數熟悉的話,這裏實現的方式估計你已經猜到了(窗口over函數),上sql...
哈哈,上圖的day_sum估計大家很熟悉了吧,哈哈哈~ 看來已經成功地完成了日數據部分,這裏可能的難點可能就兩點
一是使用聚合函數(sum)+分組(group by)做行專列(當然postgresql也有其他很好用的行專列擴展,這裏就不介紹啦~)另一個是使用窗口函數(over)對明細提前做 按渠道的窗口匯總,這樣渠道日合計(行)的數據就有啦~想想是不是很容易😂,接下來我們看看第二部分數據怎麽獲取~
第二部分數據(月份匯總數據)
月份匯總的數據看似簡單的可怕,如果您熟練掌握postgresql中的日期處理的話估計分分鐘就能搞定,這裏就不耍大刀了,直接放出sql,哈哈哈😄
報表數據最終求解
現在,我們將求解的兩部分數據按渠道channel字段做inner join合并以上兩部分數據,合并后的數據大致是這樣子的
這個是sql
看,匯總的數據已經有了,已經可以算作是最終結果了(如果你需要報表系統來計算匯總行數據的話),當然 ,我們的報表系統過於繁瑣(不是不能做,而是太麻煩),需要你將做好的菜喂給它吃,這時,該怎麽辦呢。。。,哈哈哈 我們似乎忘記了很久不用的rollup函數(一開始我也沒發現有這麽個函數哈哈),試試看吧
數是對的,意味著我們成功了~😂
總結如果您肯下功夫學,postgresql世界有很多精彩的東西,當然也有一些東西對比mysql顯得繁瑣些,不過本著學習的心態,我們縂能剋服這些,同時我們還是能做出超出我們自身能力範疇的東西的,哈哈,各位加油哦~
下章,我將講一講如何實現通過sql實現前端合并單元格的效果,是不是很神奇(我保證你全網搜不到), 希望不翻車,哈哈哈~
到此这篇关于postgresql高级应用之行转列&汇总求和的实现思路的文章就介绍到这了,更多相关postgresql行转列汇总求和内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!