亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL實現交叉表(行列轉換)的5種方法示例

2020-03-12 23:45:26
字體:
來源:轉載
供稿:網友

交叉表

交叉表(Cross Tabulations)是一種常用的分類匯總表格。使用交叉表查詢,顯示源于表中某個字段的匯總值,并將它們分組,其中一組列在數據表的左側,另一組列在數據表的上部。行和列的交叉處可以對數據進行多種匯總計算,如:求和、平均值、記數、最大值、最小值等。使用交叉表查詢數據非常直觀明了,被廣泛應用。交叉表查詢也是數據庫的一個特點。

例如:

  select 表1.組名,
  (select 表1.成員姓名 from 表2 b where 表1.成員1id=表2.成員id) as 成員1id,
  (select 表1.成員姓名 from 表2 b where 表1.成員2id=表2.成員id) as 成員2id,
  (select 表1.成員姓名 from 表2 b where 表1.成員3id=表2.成員id) as 成員3id
  from 表1,表2
  --這種就是交叉表查詢

交叉報表是報表當中常見的類型,屬于基本的報表,是行、列方向都有分組的報表。這里牽涉到另外一個概念即分組報表。這是所有報表當中最普通,最常見的報表類型,也是所有報表工具都支持的一種報表格式。從一般概念上來講,分組報表就是只有縱向的分組。傳統的分組報表制作方式是把報表劃分為條帶狀,用戶根據一個數據綁定向導指定分組,匯總字段,生成標準的分組報表。

這里我來演示下在POSTGRESQL里面如何實現交叉表的展示,下面話不多說了,來一起看看詳細的介紹吧

原始表數據如下:

t_girl=# select * from score;  name | subject | score -------+---------+-------  Lucy | English | 100  Lucy | Physics | 90  Lucy | Math | 85  Lily | English | 95  Lily | Physics | 81  Lily | Math | 84  David | English | 100  David | Physics | 86  David | Math | 89  Simon | English | 90  Simon | Physics | 76  Simon | Math | 79 (12 rows)   Time: 2.066 ms 

想要實現以下的結果:

name | English | Physics | Math ------+---------+---------+------ Simon |  90 |  76 | 79 Lucy |  100 |  90 | 85 Lily |  95 |  81 | 84 David |  100 |  86 | 89 

大致有以下幾種方法:

1、用標準SQL展現出來

t_girl=# select name, t_girl-# sum(case when subject = 'English' then score else 0 end) as "English", t_girl-# sum(case when subject = 'Physics' then score else 0 end) as "Physics", t_girl-# sum(case when subject = 'Math' then score else 0 end) as "Math" t_girl-# from score t_girl-# group by name order by name desc;  name | English | Physics | Math -------+---------+---------+------  Simon |  90 |  76 | 79  Lucy |  100 |  90 | 85  Lily |  95 |  81 | 84  David |  100 |  86 | 89 (4 rows)   Time: 1.123 ms 

2、用PostgreSQL 提供的第三方擴展 tablefunc 帶來的函數實現

以下函數crosstab 里面的SQL必須有三個字段,name, 分類以及分類值來作為起始參數,必須以name,分類值作為輸出參數。

t_girl=# SELECT * FROM crosstab('select name,subject,score from score order by name desc',$$values ('English'::text),('Physics'::text),('Math'::text)$$) AS score(name text, English int, Physics int, Math int);  name | english | physics | math -------+---------+---------+------  Simon |  90 |  76 | 79  Lucy |  100 |  90 | 85  Lily |  95 |  81 | 84  David |  100 |  86 | 89 (4 rows)   Time: 2.059 ms 

3、用PostgreSQL 自身的聚合函數實現

t_girl=# select name,split_part(split_part(tmp,',',1),':',2) as "English", t_girl-# split_part(split_part(tmp,',',2),':',2) as "Physics", t_girl-# split_part(split_part(tmp,',',3),':',2) as "Math" t_girl-# from t_girl-# ( t_girl(# select name,string_agg(subject||':'||score,',') as tmp from score group by name order by name desc t_girl(# ) as T;  name | English | Physics | Math -------+---------+---------+------  Simon | 90  | 76  | 79  Lucy | 100  | 90  | 85  Lily | 95  | 81  | 84  David | 100  | 86  | 89 (4 rows)   Time: 2.396 ms 

4、 存儲函數實現

create or replace function func_ytt_crosstab_py () returns setof ytt_crosstab as $ytt$  for row in plpy.cursor("select name,string_agg(subject||':'||score,',') as tmp from score group by name order by name desc"):   a = row['tmp'].split(',')   yield (row['name'],a[0].split(':')[1],a[1].split(':')[1],a[2].split(':')[1]) $ytt$ language plpythonu;   t_girl=# select name,english,physics,math from func_ytt_crosstab_py();  name | english | physics | math -------+---------+---------+------  Simon | 90  | 76  | 79  Lucy | 100  | 90  | 85  Lily | 95  | 81  | 84  David | 100  | 86  | 89 (4 rows)   Time: 2.687 ms 

5、 用PLPGSQL來實現

t_girl=# create type ytt_crosstab as (name text, English text, Physics text, Math text); CREATE TYPE Time: 22.518 ms   create or replace function func_ytt_crosstab () returns setof ytt_crosstab as $ytt$  declare v_name text := '';     v_english text := '';   v_physics text := '';   v_math text := '';   v_tmp_result text := '';  declare cs1 cursor for select name,string_agg(subject||':'||score,',') from score group by name order by name desc; begin  open cs1;  loop  fetch cs1 into v_name,v_tmp_result;  exit when not found;  v_english = split_part(split_part(v_tmp_result,',',1),':',2);  v_physics = split_part(split_part(v_tmp_result,',',2),':',2);  v_math = split_part(split_part(v_tmp_result,',',3),':',2);  return query select v_name,v_english,v_physics,v_math;  end loop; end; $ytt$ language plpgsql;   t_girl=# select name,English,Physics,Math from func_ytt_crosstab();  name | english | physics | math -------+---------+---------+------  Simon | 90  | 76  | 79  Lucy | 100  | 90  | 85  Lily | 95  | 81  | 84  David | 100  | 86  | 89 (4 rows)   Time: 2.127 ms 

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到PostgreSQL頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
96精品视频在线| 欧美性做爰毛片| 久久久极品av| 一夜七次郎国产精品亚洲| 少妇精69xxtheporn| 欧美一级高清免费播放| 国产精品色视频| 日本久久久久久久| 国产成人精品999| 久久久久久久久久久人体| 久久网福利资源网站| 国产亚洲成av人片在线观看桃| 国产精品丝袜一区二区三区| 国产精品18久久久久久麻辣| 国产成人aa精品一区在线播放| 成人黄色片在线| 日av在线播放中文不卡| 91久久国产精品91久久性色| 91av视频导航| 日韩一区二区三区在线播放| 国产精品黄页免费高清在线观看| 欧美日韩国产综合视频在线观看中文| 久久久久久国产精品| 久久精品视频在线| 欧美日韩国产一区二区三区| 51视频国产精品一区二区| 久久精品视频播放| 一本色道久久88综合亚洲精品ⅰ| 色综合亚洲精品激情狠狠| 亚洲精品国产成人| 成人激情视频在线| 亚洲色图13p| 国产a级全部精品| 欧美黑人极品猛少妇色xxxxx| 91久久精品国产91久久性色| 欧美一级视频免费在线观看| 亚洲欧美激情四射在线日| 国产91精品最新在线播放| 国产精品入口夜色视频大尺度| 中文字幕亚洲综合久久| 5566成人精品视频免费| 欧美一区在线直播| 4k岛国日韩精品**专区| 欧美又大粗又爽又黄大片视频| 欧美激情乱人伦| 亚洲男人第一av网站| 三级精品视频久久久久| 亚洲欧美一区二区精品久久久| 久久精品中文字幕| 亚洲精品国产综合区久久久久久久| 成人h片在线播放免费网站| 国产精品看片资源| 日韩在线观看精品| 欧美精品999| 中文在线不卡视频| 午夜精品久久久久久久久久久久久| 欧美一区二区三区精品电影| 麻豆国产精品va在线观看不卡| 欧美国产日韩精品| 欧美视频第一页| 国产97色在线| 成人黄色av播放免费| 国产精品久久久久91| 在线观看中文字幕亚洲| 亚洲最新av网址| 国产精品免费网站| 国产在线观看不卡| 美日韩丰满少妇在线观看| 日韩av片免费在线观看| 美乳少妇欧美精品| 亚洲第一页自拍| 日韩电视剧在线观看免费网站| 最新69国产成人精品视频免费| 欧美电影《睫毛膏》| 原创国产精品91| 国内精品久久久久久久久| 欧美在线观看视频| 亚洲成人久久一区| 国产精品欧美日韩| 亚洲精品一区二三区不卡| 国产精品久久久久久久久| 日韩美女在线看| 欧美日韩国产色| 伊人久久综合97精品| 欧美一级大片在线免费观看| 庆余年2免费日韩剧观看大牛| 精品在线欧美视频| 精品亚洲男同gayvideo网站| 国产精品久久久久久婷婷天堂| 欧美乱大交xxxxx另类电影| 国产日韩av高清| 欧美高清在线视频观看不卡| 日韩小视频在线观看| 中文字幕日韩欧美在线| 日韩av免费观影| 国产mv免费观看入口亚洲| 国产亚洲精品久久久| 亚洲福利精品在线| 亚洲一区二区少妇| 日本成人精品在线| 国产一区二区在线免费视频| 精品久久久久久久久久国产| 精品久久久av| 中文字幕自拍vr一区二区三区| 粗暴蹂躏中文一区二区三区| 亚洲自拍欧美另类| 亚洲三级黄色在线观看| 亚洲色图在线观看| 久久成人免费视频| 亚洲老板91色精品久久| 亚洲欧美激情精品一区二区| 欧美一区二区大胆人体摄影专业网站| 国产91精品最新在线播放| 成人午夜两性视频| 国产精品久久激情| 日韩精品极品在线观看播放免费视频| 成人国产精品色哟哟| 精品二区三区线观看| 久久久免费在线观看| 亚洲激情成人网| 国产精品免费网站| 亚洲国语精品自产拍在线观看| 亚洲大胆人体视频| 最近的2019中文字幕免费一页| 亚洲国产91色在线| 国产精品99免视看9| 亚洲精品视频免费在线观看| 美女福利精品视频| 日韩在线视频免费观看高清中文| 欧美精品videossex88| 亚洲欧美激情另类校园| 久久久999国产| 色噜噜狠狠狠综合曰曰曰88av| 日本一区二区在线播放| 亚洲精品www| 日韩麻豆第一页| 久久亚洲春色中文字幕| 日韩综合视频在线观看| 国语自产精品视频在线看抢先版图片| 欧美成年人视频网站欧美| 成人午夜激情网| 91久久久在线| 欧美国产一区二区三区| 亚洲国产第一页| 成人在线视频福利| 国产精品白丝av嫩草影院| 日韩视频第一页| 欧美成人精品在线观看| 国产精品www| 91精品久久久久久久久久久久久久| 国产成人精品免高潮费视频| 日本国产高清不卡| 欧美日韩国产精品一区二区三区四区| www.久久久久久.com| 欧美性xxxx极品高清hd直播| 国产成人亚洲综合91精品| 国产日韩欧美黄色| 欧美在线精品免播放器视频| 午夜精品一区二区三区在线播放| 亚洲国产精品美女| 色哟哟亚洲精品一区二区| 欧美性猛交xxxx免费看| 一区二区三区久久精品| 欧美日本亚洲视频|