最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

postgresql高級應(yīng)用之合并單元格的思路詳解

 更新時間:2021年05月08日 08:43:41   作者:funnyZpC  
這篇文章主要介紹了postgresql高級應(yīng)用之合并單元格,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1.寫在前面✍

繼上一篇postgresql高級應(yīng)用之行轉(zhuǎn)列&匯總求和之后想更進(jìn)一步做點兒復(fù)雜的(圖表暫且不論哈😂),當(dāng)然作為報表,出現(xiàn)最多的無非就是合并單元格了,是的,我已經(jīng)迫不及待啦😎~

2.思考

首先,我們的腦海中應(yīng)該有一個對前端table有一個大致的了解, 當(dāng)然這對非前端的同學(xué)十分的不友好,如果您嘗試閲讀以下內(nèi)容存在困難的話(前端html、javascript) 可就此打住哈。。。
enn...,讓我先稍稍解釋下前端 html 的表格格式吧😀

2.1 前端html->table基本結(jié)構(gòu)

先給出一個十分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屬性進(jìn)行橫向合并,橫向被合并的單元格位置需要騰出來 -->
			<!-- 以下橫向合并兩個單元格,所以第二個td標(biāo)簽就不要寫了,否則會溢出哦~ -->
			<td colspan="2">橫向合并了兩個單元格</td><td>第二行第3個</td>
		</tr>
		<tr>
			<td>第三行第1個</td><td>第三行第2個</td><td>第三行第3個</td>
		</tr>
		<tr>
			<!-- 使用rowspan屬性進(jìn)行縱向合并,縱向合并的(跨越的)單元格位置需要騰出來 -->
			<!-- 以下縱向合并三個個單元格(在本行最後一個標(biāo)簽),所以下兩行的最後兩個td標(biāo)簽就不要寫啦~,否則同樣會溢出哦~ -->
			<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文件)的樣子是這樣的~

以上總結(jié)就是colspan實現(xiàn)橫向合并單元格,rowspan實現(xiàn)縱向合并單元格~

呃嗯,既然我們知道了html需要這兩個屬性值(也就是合并的行數(shù)或合并的列數(shù)),那麼就是要在sql中生成這兩個參數(shù)值然後提供給前端的同學(xué)使用哈,這是淺層意思,那麼深層意思是什麼呢???容我想想看。。。

  • 對於橫向合并單元格

需要使用 case+when+then 語句判斷是否需要橫向合并(重要的是要給出橫向合并的數(shù)值),這樣想是合理的,可能造成的困擾可能是這樣做會造成sql冗餘(當(dāng)然也是不得已而爲(wèi)之),當(dāng)然本節(jié)就不再講橫向合并單元格啦

  • 對於縱向合并單元格

step1.👉 如果使用聚合+窗口函數(shù)來計算需要合并的相同的列數(shù),可能造成的問題是生成的rowspan對於相同列來説數(shù)值是一樣的(如下圖),這樣不可以欸~

step2.👉 。。。既然可以通過step1生成窗口內(nèi)合并總數(shù)的數(shù)值,當(dāng)然也可以通過窗口函數(shù)來生成一個倒排序列的列,哈哈😊,你似乎發(fā)現(xiàn)了什麼~~~,對,將窗口合并總數(shù)的列與窗口內(nèi)倒排序的列做等值判斷,相等的不就是第一個合并數(shù)字列了。。。bingo
倒排序的窗口列

求總的列+倒排序的列

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

光説不練假把式,通過一下測試腳本試試囖😎~

2.2表結(jié)構(gòu)

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表數(shù)據(jù)

INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0015', '洗發(fā)露', '36', '洗護(hù)', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0008', '香皂', '17.5', '洗護(hù)', '日用品');
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', '洗衣機(jī)', '4999', '大電器', '電器');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0013', '圍巾', '93', '配飾', '服裝配飾');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0017', '特步?jīng)鲂?, '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', '作業(yè)本', '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', '洗護(hù)', '日用品');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0018', '繪圖筆', '15', '筆', '文具');
INSERT INTO "report2"("id", "name", "price", "level2", "level1") VALUES ('0019', '汽水', '3.5', '其它', '零食');

3.🎉結(jié)果集最終求解

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;

_紅色_部分即為前端童鞋需要的合并數(shù)值哈🥰~

如果你能看懂以上問題及求解的 sql ,恭喜你又升級啦😂

總結(jié)下::對問題的分析✨以及對問題求解的思考🤔很重要嘛,當(dāng)然還包含對postgresql所提供工具的靈活使用 👉 總會產(chǎn)生意想不到的驚喜,哈哈😘~

到此這篇關(guān)于postgresql高級應(yīng)用之合并單元格的思路詳解的文章就介紹到這了,更多相關(guān)postgresql合并單元格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • postgresql 實現(xiàn)查詢某時間區(qū)間的所有日期案例

    postgresql 實現(xiàn)查詢某時間區(qū)間的所有日期案例

    這篇文章主要介紹了postgresql 實現(xiàn)查詢某時間區(qū)間的所有日期案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL數(shù)據(jù)庫儲存空間不足的解決方案

    PostgreSQL數(shù)據(jù)庫儲存空間不足的解決方案

    在使用 PostgreSQL 數(shù)據(jù)庫時,可能會遇到存儲空間不足的問題,這個問題不僅會影響數(shù)據(jù)庫的正常運行,還可能導(dǎo)致數(shù)據(jù)丟失或應(yīng)用程序出現(xiàn)故障,因此,了解如何應(yīng)對這種情況至關(guān)重要,所以本文給大家就介紹了PostgreSQL數(shù)據(jù)庫儲存空間不足的解決方案,需要的朋友可以參考下
    2024-07-07
  • Postgresql自定義函數(shù)詳解

    Postgresql自定義函數(shù)詳解

    這篇文章主要介紹了Postgresql自定義函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程

    PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫遷移部署實戰(zhàn)教程,由于項目本身就是基于PostgreSQL數(shù)據(jù)庫構(gòu)建的,因此數(shù)據(jù)庫遷移將變得十分便捷,接下來,我將簡要介紹我們的遷移步驟,需要的朋友可以參考下
    2023-07-07
  • 基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明

    基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明

    這篇文章主要介紹了基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Postgresql的日志配置教程詳解

    Postgresql的日志配置教程詳解

    這篇文章主要介紹了Postgresql的日志配置教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • postgresql 中的加密擴(kuò)展插件pgcrypto用法說明

    postgresql 中的加密擴(kuò)展插件pgcrypto用法說明

    這篇文章主要介紹了postgresql 中的加密擴(kuò)展插件pgcrypto用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Postgresql 查詢表引用或被引用的外鍵操作

    Postgresql 查詢表引用或被引用的外鍵操作

    這篇文章主要介紹了Postgresql 查詢表引用或被引用的外鍵操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL設(shè)置主鍵從1開始自增的詳細(xì)步驟

    PostgreSQL設(shè)置主鍵從1開始自增的詳細(xì)步驟

    和MySQL不同,在 PostgreSQL 中,設(shè)置主鍵從1開始自增并重新開始自增是通過序列(sequence)來實現(xiàn)的,本文給大家分享PostgreSQL設(shè)置主鍵從1開始自增的詳細(xì)步驟,感興趣的朋友一起看看吧
    2023-11-11
  • 實操解決Navicat連接postgresql時出現(xiàn)‘datlastsysoid does not exist‘報錯的問題

    實操解決Navicat連接postgresql時出現(xiàn)‘datlastsysoid does not&

    這篇文章主要介紹了實操解決Navicat連接postgresql時出現(xiàn)‘datlastsysoid does not exist‘報錯的問題,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12

最新評論

沙雅县| 五大连池市| 灌阳县| 翁牛特旗| 哈巴河县| 恭城| 蓬溪县| 普安县| 安仁县| 沈阳市| 磐石市| 茌平县| 杭锦后旗| 敦化市| 德清县| 海城市| 裕民县| 孟村| 阳西县| 大埔区| 木兰县| 渝北区| 兰坪| 马山县| 枣庄市| 扶余县| 通化县| 沙河市| 湘潭市| 光泽县| 乌拉特后旗| 大埔县| 敖汉旗| 太保市| 临泽县| 三穗县| 武安市| 天峻县| 德庆县| 犍为县| 陆良县|