亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > PostgreSQL實現交叉表(行列轉換)的5種方法示例

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

熱門標簽:重慶自動外呼系統定制 打電話智能電銷機器人授權 漯河外呼電話系統 辦公外呼電話系統 外呼調研系統 海豐有多少商家沒有地圖標注 地圖標注和圖片名稱的區別 合肥公司外呼系統運營商 美容工作室地圖標注

交叉表

交叉表(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 

總結

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

您可能感興趣的文章:
  • PostgreSQL 實現列轉行問題
  • PostgreSQL 實現將多行合并轉為列
  • postgresql高級應用之行轉列&匯總求和的實現思路

標簽:晉城 烏海 株洲 來賓 錦州 珠海 蚌埠 衡陽

巨人網絡通訊聲明:本文標題《PostgreSQL實現交叉表(行列轉換)的5種方法示例》,本文關鍵詞  PostgreSQL,實現,交叉表,行列,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL實現交叉表(行列轉換)的5種方法示例》相關的同類信息!
  • 本頁收集關于PostgreSQL實現交叉表(行列轉換)的5種方法示例的相關信息資訊供網民參考!
  • 推薦文章
    好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品久久久久久中文字幕一区| 久久精品人人做人人爽97| 日日爽天天| 天天做日日干| 日本伦理黄色大片在线观看网站| 一级女性大黄生活片免费| 精品视频免费在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品视频免费在线| 日本特黄特色aaa大片免费| 日韩一级黄色大片| 国产亚洲免费观看| 国产不卡在线观看| 国产福利免费观看| 99久久精品费精品国产一区二区| 九九久久国产精品| 国产91精品一区| 国产视频一区在线| 成人a级高清视频在线观看| 四虎影视精品永久免费网站 | 99热精品一区| 一级毛片视频免费| 精品在线观看一区| 黄色免费网站在线| 黄色短视频网站| 国产国语对白一级毛片| 日本在线不卡免费视频一区| 97视频免费在线观看| 二级特黄绝大片免费视频大片| 国产91丝袜高跟系列| 青青久久国产成人免费网站| 国产不卡高清| 色综合久久手机在线| 日本免费乱人伦在线观看| 国产成a人片在线观看视频| 午夜激情视频在线观看| 国产精品自拍在线| 国产亚洲免费观看| 一级女性全黄生活片免费| 国产亚洲精品aaa大片| 国产原创中文字幕| 一本高清在线| 国产精品自拍亚洲| 日韩av东京社区男人的天堂| 午夜在线亚洲| 成人高清护士在线播放| 91麻豆精品国产综合久久久| 99久久精品费精品国产一区二区| 国产网站在线| 日本特黄一级| 九九久久国产精品| 亚洲天堂在线播放| 天堂网中文在线| 久久国产一区二区| 黄视频网站免费观看| 99久久精品费精品国产一区二区| 成人免费一级毛片在线播放视频| 青青青草影院| 免费一级片在线观看| 亚洲精品中文一区不卡| 九九九国产| 日本伦理片网站| 天天做日日干| 亚久久伊人精品青青草原2020| 成人免费一级毛片在线播放视频| 一级毛片看真人在线视频| 国产一级强片在线观看| 欧美激情一区二区三区在线 | 欧美激情在线精品video| 午夜久久网| 免费一级片在线观看| 日本在线不卡免费视频一区| 亚洲 欧美 91| 成人免费福利片在线观看| 精品视频在线观看一区二区三区| 黄视频网站免费观看| 国产a一级| 超级乱淫黄漫画免费| 精品视频在线看| 91麻豆国产级在线| 欧美a免费| 四虎久久影院| 九九免费精品视频| 二级特黄绝大片免费视频大片| 青青青草影院| 高清一级做a爱过程不卡视频| 国产伦精品一区二区三区无广告 | 成人影院久久久久久影院| 99色视频在线观看| 欧美日本韩国| 国产91素人搭讪系列天堂| 国产精品免费精品自在线观看| 国产一级强片在线观看| 天天色色色| 一本高清在线| 午夜在线亚洲| 欧美另类videosbestsex高清 | 日韩av东京社区男人的天堂| 精品国产亚洲人成在线| 国产视频久久久| 欧美国产日韩久久久| 国产精品123| 精品国产一区二区三区精东影业| 99久久精品国产国产毛片| 国产麻豆精品免费密入口| 精品在线观看一区| 99久久精品国产国产毛片| 精品久久久久久免费影院| 国产高清视频免费| 美女免费精品视频在线观看| 欧美另类videosbestsex视频| 香蕉视频久久| 国产福利免费观看| 91麻豆精品国产高清在线| 999精品在线| 精品国产一区二区三区精东影业| 国产91精品一区| 午夜激情视频在线观看| 国产a一级| 一级片片| 国产亚洲免费观看| 日本特黄特色aaa大片免费| 一 级 黄 中国色 片| 97视频免费在线观看| 天天做人人爱夜夜爽2020 | 亚洲爆爽| 欧美大片毛片aaa免费看| 免费国产在线观看不卡| 国产91精品露脸国语对白| 国产一区二区精品尤物| 免费国产在线观看不卡| 日韩男人天堂| 国产麻豆精品视频| 青青久久国产成人免费网站| 日韩一级精品视频在线观看| 欧美国产日韩久久久| 毛片电影网| 精品国产亚洲人成在线| 黄色短视频网站| 免费国产在线观看不卡| 色综合久久天天综合观看| 欧美爱色| 精品视频免费看| 亚欧成人毛片一区二区三区四区 | 97视频免费在线观看| 精品国产一区二区三区精东影业| 99久久网站| 四虎久久影院| 国产伦精品一区三区视频| 国产一区国产二区国产三区| 国产视频在线免费观看| 国产极品精频在线观看| 国产成人精品综合| 国产91丝袜高跟系列| 欧美日本韩国| 美国一区二区三区| 精品视频在线观看一区二区三区| 久久精品成人一区二区三区| 亚洲 国产精品 日韩| 国产成人啪精品| 欧美激情一区二区三区中文字幕| 麻豆午夜视频| 黄视频网站在线免费观看| 久久久久久久免费视频| 一本高清在线| 青青久久网| 精品视频一区二区三区| a级毛片免费全部播放| 久久99中文字幕| 成人高清视频免费观看| 国产91素人搭讪系列天堂| 欧美a免费| 国产一区免费在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产a视频| 国产一区国产二区国产三区| 午夜欧美成人香蕉剧场| 国产网站免费观看| 91麻豆精品国产高清在线| 欧美1区| 欧美日本免费| 一级毛片看真人在线视频| 国产欧美精品午夜在线播放| 亚洲天堂在线播放| 91麻豆tv| 日韩中文字幕在线播放| 91麻豆tv| 日韩在线观看视频网站| 91麻豆国产级在线| 尤物视频网站在线观看| 久久精品免视看国产明星| 一 级 黄 中国色 片| 黄色免费网站在线| 日本特黄一级| 韩国毛片免费大片| 日日爽天天| 国产欧美精品午夜在线播放| 国产原创中文字幕| 999精品在线|