Heim >Datenbank >MySQL-Tutorial > 【原创】POSTGRESQL交叉表的实现

【原创】POSTGRESQL交叉表的实现

WBOY
WBOYOriginal
2016-06-07 16:46:03866Durchsuche

这里我来演示下在POSTGRESQL里面如何实现交叉表的展示,至于什么是交叉表,我就不多说了,度娘去哦。原始表数据如下:t_girl=#select*fromscore;name|subject&n.

这里我来演示下在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



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn