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

PostgreSQL實現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法示例

 更新時間:2018年08月26日 15:18:49   作者:Hason_Huang  
這篇文章主要給大家介紹了關(guān)于PostgreSQL實現(xiàn)交叉表(行列轉(zhuǎn)換)的5種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

交叉表

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

例如:

  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
  --這種就是交叉表查詢

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

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

原始表數(shù)據(jù)如下:

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 

想要實現(xiàn)以下的結(jié)果:

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

大致有以下幾種方法:

1、用標準SQL展現(xiàn)出來

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 帶來的函數(shù)實現(xiàn)

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

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 自身的聚合函數(shù)實現(xiàn)

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、 存儲函數(shù)實現(xiàn)

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來實現(xiàn)

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 

總結(jié)

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

相關(guān)文章

  • postgresql行轉(zhuǎn)列與列轉(zhuǎn)行圖文教程

    postgresql行轉(zhuǎn)列與列轉(zhuǎn)行圖文教程

    PostgreSQL是一種開源的關(guān)系型數(shù)據(jù)庫,它提供了多種管理工具來操作數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于postgresql行轉(zhuǎn)列與列轉(zhuǎn)行的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Docker修改Postgresql密碼的方法詳解

    Docker修改Postgresql密碼的方法詳解

    在Docker環(huán)境中,對已運行的PostgreSQL數(shù)據(jù)庫實例進行密碼更改是一項常見的維護操作,下面將詳述如何通過一系列命令行操作來實現(xiàn)這一目標,需要的朋友可以參考下
    2024-07-07
  • postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作

    postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作

    這篇文章主要介紹了postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作詳解

    postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作詳解

    這篇文章主要為大家詳細介紹了postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2023-12-12
  • PostgreSQL數(shù)據(jù)庫中DISTINCT關(guān)鍵字的四種用法詳解

    PostgreSQL數(shù)據(jù)庫中DISTINCT關(guān)鍵字的四種用法詳解

    PostgreSQL 不但高度兼容 SQL 標準,同時還對很多語法進行了擴展,可以用于實現(xiàn)一些特殊的功能,今天我們就來介紹一下 PostgreSQL 數(shù)據(jù)庫中 DISTINCT 關(guān)鍵字的 4 種不同用法,需要的朋友可以參考下
    2024-04-04
  • postgres之jsonb屬性的使用操作

    postgres之jsonb屬性的使用操作

    這篇文章主要介紹了postgres之jsonb屬性的使用操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用pg_basebackup對Postgre進行備份與恢復(fù)的實現(xiàn)

    使用pg_basebackup對Postgre進行備份與恢復(fù)的實現(xiàn)

    這篇文章主要介紹了使用pg_basebackup對Postgre進行備份與恢復(fù)的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql數(shù)據(jù)庫表ID自增的實現(xiàn)代碼

    postgresql數(shù)據(jù)庫表ID自增的實現(xiàn)代碼

    postgresql數(shù)據(jù)庫可以創(chuàng)建主鍵,但是沒有像mysql那樣直接指定主鍵自增的auto_increment關(guān)鍵字,因此如果在postgresql中創(chuàng)建表指定主鍵自增使用auto_increment會報錯,本文通過一個實例給大家演示自增ID的實現(xiàn),需要的朋友可以參考下
    2023-12-12
  • PgSQl臨時表創(chuàng)建及應(yīng)用實例解析

    PgSQl臨時表創(chuàng)建及應(yīng)用實例解析

    這篇文章主要介紹了PgSQl臨時表創(chuàng)建及應(yīng)用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-12-12
  • 淺談PostgreSQL的客戶端認證pg_hba.conf

    淺談PostgreSQL的客戶端認證pg_hba.conf

    這篇文章主要介紹了淺談PostgreSQL的客戶端認證pg_hba.conf,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

永宁县| 平和县| 兴业县| 油尖旺区| 乐东| 城步| 甘肃省| 孝感市| 秭归县| 清远市| 彭泽县| 乐东| 驻马店市| 翼城县| 芒康县| 成都市| 南投县| 平陆县| 鄂温| 佳木斯市| 盱眙县| 湖北省| 西盟| 盘锦市| 东明县| 九寨沟县| 大姚县| 炉霍县| 崇信县| 永定县| 哈尔滨市| 旬阳县| 乌海市| 清新县| 田阳县| 上饶市| 武安市| 洛宁县| 眉山市| 扎兰屯市| 马公市|