【原创】POSTGRESQL交叉表的实现

php中文网
发布: 2016-06-07 16:46:03
原创
1006人浏览过

这里我来演示下在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 带来的函数实现

MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版
MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版

MediPro乡镇政府门户网站系统,适合乡镇政府机构创建地方门户网站,用以宣传本地资源,实现政务公开,促进乡镇基层信息化建设。本系统基于PHP+MYSQL开发,预设了乡镇风采、党政机构、政务公开、投资指南、服务导航、文件下载、公众互动、领导信箱等乡镇政府门户网站常用的栏目和测试数据,采用适合乡镇政府门户网站的专用模版,增强了系统的针对性和易用性。除了文章系统、图文系统、下载系统、社区交流、反馈表单

MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版 0
查看详情 MediPro乡镇政府门户网站系统 5.1.0 UTF-8简体中文版

以下函数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



最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号