postgresql高级应用之合并单元格
postgresql高级应用之合并单元格
1.写在前面✍
继上一篇postgresql高级应用之行转列&汇总求和之后想更进一步做点儿复杂的(圖表暫且不論哈),当然作为報表,出現最多的無非就是合并單元格了,是的,我已經迫不及待啦~
2.思考
首先,我們的腦海中應該有一個對前端table有一個大致的了解, 當然這對非前端的同學十分的不友好,如果您嘗試閲讀以下内容存在困難的話(前端html、javascript) 可就此打住哈。。。
enn...,讓我先稍稍解釋下前端 html 的表格格式吧
2.1 前端html->table基本結構
先給出一個十分base的html demo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>demo</title>
</head>
<body>
<!-- 這裏定義了兩個屬性 border:定義表格邊框 cellpadding:定義單元格大小 -->
<table border="3" cellpadding="8">
<thead>
<tr>
<th>表頭1</th><th>表頭2</th><th>表頭3</th>
</tr>
</thead>
<tbody>
<tr>
<td>第一行第1個</td><td>第一行第2個</td><td>第一行第3個</td>
</tr>
<tr>
<!-- 使用colspan屬性進行橫向合并,橫向被合并的單元格位置需要騰出來 -->
<!-- 以下橫向合并兩個單元格,所以第二個td標簽就不要寫了,否則會溢出哦~ -->
<td colspan="2">橫向合并了兩個單元格</td><td>第二行第3個</td>
</tr>
<tr>
<td>第三行第1個</td><td>第三行第2個</td><td>第三行第3個</td>
</tr>
<tr>
<!-- 使用rowspan屬性進行縱向合并,縱向合并的(跨越的)單元格位置需要騰出來 -->
<!-- 以下縱向合并三個個單元格(在本行最後一個標簽),所以下兩行的最後兩個td標簽就不要寫啦~,否則同樣會溢出哦~ -->
<td>第四行第1個</td><td>第四行第2個</td><td rowspan="3">縱向合并了三個單元格</td>
</tr>
<tr>
<td>第五行第1個</td><td>第五行第2個</td>
</tr>
<tr>
<td>第六行第1個</td><td>第六行第2個</td>
</tr>
</tbody>
</table>
</body>
</html>
瀏覽器渲染出來(使用瀏覽器打開html文件)的樣子是這樣的~

以上總結就是colspan實現橫向合并單元格,rowspan實現縱向合并單元格~
呃嗯,既然我們知道了html需要這兩個屬性值(也就是合并的行數或合并的列數),那麽就是要在sql中生成這兩個參數值然後提供給前端的同學使用哈,這是淺層意思,那麽深層意思是什麽呢???容我想想看。。。
對於橫向合并單元格
需要使用
case+when+then語句判斷是否需要橫向合并(重要的是要給出橫向合并的數值),這樣想是合理的,可能造成的困擾可能是這樣做會造成sql冗餘(當然也是不得已而爲之),當然本節就不再講橫向合并單元格啦對於縱向合并單元格
step1. 如果使用
聚合+窗口函數來計算需要合并的相同的列數,可能造成的問題是生成的rowspan對於相同列來説數值是一樣的(如下圖),這樣不可以欸~

step2. 。。。既然可以通過
step1生成窗口内合并總數的數值,當然也可以通過窗口函數來生成一個倒排序列的列,哈哈,你似乎發現了什麽~~~,對,將窗口合并總數的列與窗口内倒排序的列做等值判斷,相等的不就是第一個合并數字列了。。。bingo
倒排序的窗口列

求總的列+倒排序的列

step3. 既然我們能做一個數據列的合并,也能做兩個列的合并(也可以是一個二級列,注意
order by對合并行的影響哦),這裏簡單各一個經過層層包裝後的合并數值列生成,注意下圖的綠色部分哦

光説不練假把式,通過一下測試脚本試試囖~
2.2表结构
drop table if EXISTS report2 ;
CREATE TABLE report2 (
"id" varchar(10) primary key,
"name" varchar(50),
"price" numeric,
"level2" varchar(50) ,
"level1" varchar(50)
);
2.3表字段注释
| 字段 | 注释 |
|---|---|
| id | 主键 |
| name | 商品名称 |
| price | 价格 |
| level2 | 二级分类 |
| level1 | 一级分类 |
2.4表数据
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0015', '洗发露', '36', '洗护', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0008', '香皂', '17.5', '洗护', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0007', '薯条', '7.5', '垃圾食品', '零食');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0009', '方便面', '3.5', '垃圾食品', '零食');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0004', '辣条', '5.6', '垃圾食品', '零食');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0006', 'iPhone X', '9600', '小电器', '电器');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0003', '手表', '1237.55', '小电器', '电器');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0012', '电视', '3299', '大电器', '电器');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0016', '洗衣机', '4999', '大电器', '电器');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0013', '围巾', '93', '配饰', '服装配饰');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0017', '特步凉鞋', '499', '鞋子', '服装配饰');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0001', 'NIKE新款鞋', '900', '鞋子', '服装配饰');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0002', '外套', '110.9', '上衣', '服装配饰');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0014', '作业本', '1', '纸张', '文具');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0005', '铅笔', '7', '笔', '文具');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0010', '水杯', '27', '餐饮', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0011', '毛巾', '15', '洗护', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0018', '绘图笔', '15', '笔', '文具');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0019', '汽水', '3.5', '其它', '零食');
3.結果集最終求解
select
t1.*,
case when t_rank=t_count then t_count else null end as level1_row,
case when tu_rank=tu_count then tu_count else null end as level2_row
from
(
select
*,
row_number() over(PARTITION by level1 order by level1 asc) t_rank,
count(1) over (partition by level1) t_count,
row_number() over(PARTITION by level1,level2 order by level1,level2 asc) tu_rank,
count(1) over (partition by level1,level2) tu_count
from report2 order by level1
) t1 order by t1.level1,t_rank desc,t_count desc,tu_rank desc,tu_count desc;
_紅色_部分即為前端童鞋需要的合并數值哈~

如果你能看懂以上問題及求解的 sql ,恭喜你又升級啦
總結下::對問題的分析以及對問題求解的思考很重要嘛,當然還包含對postgresql所提供工具的靈活使用 總會產生意想不到的驚喜,哈哈~
postgresql高级应用之合并单元格的更多相关文章
- 个人永久性免费-Excel催化剂功能第52波-相同内容批量合并单元格,取消合并单元格并填充内容
在高级Excel用户群体中无比痛恨的合并单元格,在现实的表格中却阴魂不散的纠缠不断.今天Excel催化剂也来成为“帮凶”,制造更多的合并单元格.虽然开发出此功能,请使用过程中务必要保持节制,在可以称为 ...
- NPOI_winfrom导出Excel表格(一)(合并单元格、规定范围加外边框、存储路径弹框选择)
1.导出 private void btn_print_Click(object sender, EventArgs e) { DataTable dtNew = new DataTable(); d ...
- C# 获取Excel中的合并单元格
C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...
- jquery操作表格 合并单元格
jquery操作table,合并单元格,合并相同的行 合并的方法 $("#tableid").mergeCell({ cols:[X,X] ///参数为要合并的列}) /** * ...
- NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析
我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...
- poi获取合并单元格内的第一行第一列的值
当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格 其它在合并单元格区域内的单元格不显示 示例代码如下: import java.io.FileInputStream; impo ...
- Repeater多列分别合并单元格
GridView.Repeater合并单元格可以参考http://www.cnblogs.com/zhmore/archive/2009/04/22/1440979.html,但是原文例子是合并一列的 ...
- Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行
Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行 模版格式,图格式是最简单的格式,但实际效果不是这种,实际效果图如图2 图2 ,注意看红色部分,一对一是正常的,但是有一对多的订单 ...
- easyui datagrid 合并单元格
整理以前做的东西,这个合并单元格的问题再新浪博客也写过了..... 下面这段代码是列表数据 //载入排放系数管理报表数据 function LoadEmissionReportData() { //获 ...
随机推荐
- redis使用ssh密钥远控靶机
首先说明一下我们的实验目的,我们这个实验需要利用一种公有密码,将公有密钥写入要攻击的服务器的redis数据库,然后使用我们自己的私钥进行远控肉鸡的操作. 实验环境:centos7(靶机,版本无太大 ...
- 苹果M1处理器Mac“翻车”:用户吐槽SSD
SSD如今被不少PC用户所推崇,其优势在于读写速度快.工作无噪音,不过,缺点是寿命较机械硬盘差点.厂商对SSD通常都会标注一个最大可写入量(TBW),提醒用户关注健康数据,以免掉盘等严重问题. 越来越 ...
- WBX24T2X CPEX国产化万兆交换板
WBX24T2X是基于盛科CTC5160设计的国产化6U三层万兆CPEX交换板,提供24路千兆电口和2路万兆光口,采用龙芯 2K1000处理器.支持常规的L2/L3协议,支持Telnet.SNMP ...
- 记一次jstack命令定位问题
今天天气不错,但是赶上恶意加班心情就不爽,怀着不爽的心情干活,总能创造出更多的问题,这不,今天就自己挖了一个坑,自己跳进去了,好在上来了 经过是这样的,开始调试canal采集binlog时,由于添加了 ...
- JS逆向-抠代码的第一天【手把手学会抠代码】
首先声明,本人经过无数次摸爬滚打及翻阅各类资料,理论知识极其丰富,但是抠代码怎么都抠不会. 无奈之下,只能承认:这个活,需要熟练度. 本文仅对部分参数进行解析,有需要调用,请自行根据现实情况调整. 第 ...
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- beego框架panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroller问题解决
在使用beego框架时,出现类似于panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroll ...
- 从零学脚手架(七)---webpack-dev-server使用
如果此篇对您有所帮助,在此求一个star.项目地址: OrcasTeam/my-cli webpack-dev-server使用 什么是webpack-dev-server 使用vue-cli .re ...
- SFDC 利用Schema.Describe来取得Picklist所有的选项
Salesforce的开发语言Apex与Java极为类似.也有封装,基础,多态特性. 并且也能 反射,Object的属性和Field属性. 今天主要记录的是一个需求:Visualforce Page或 ...
- Netflix业务运维分析和总结
目录 Netflix工作环境的分析和思考 为什么Netflix会做得如此极致? 海量业务规模下的技术架构和挑战 更加合理的组织架构和先进的工具体系及理念 自由与责任并存的企业文化 当前问题: 精选提问 ...