MySql Povit,[MySQL|Postgresql] Pivot 通用技巧
在Oracle和 SQLServer 都有現成的PIvot樞紐分析函式可以用
在MySQL 中如果要使用 樞紐分析 怎麼辦...
今天和大家分享如何在MySQL中使用樞紐分析
案例樣本資料:
CREATE TABLE T(
userName VARCHAR(100),
Price int,
Dt DATE
);
INSERT INTO T VALUES ('Tom',100,'2017-01-01');
INSERT INTO T VALUES ('Amy',200,'2017-01-02');
INSERT INTO T VALUES ('Tom',1311,'2017-01-03');
INSERT INTO T VALUES ('Tom',122,'2017-03-01');
INSERT INTO T VALUES ('Tom',111,'2017-04-01');
INSERT INTO T VALUES ('Amy',232,'2017-05-01');
INSERT INTO T VALUES ('Tom',2312,'2017-05-02');
INSERT INTO T VALUES ('Tom',23,'2017-05-03');
期望輸出:
SQLServer Version
在SQLServr中有Pivot 可以這樣做
SELECT userName,
coalesce(p1.[201701],0) '201701',
coalesce(p1.[201702],0) '201702',
coalesce(p1.[201703],0) '201703',
coalesce(p1.[201704],0) '201704',
coalesce(p1.[201705],0) '201705',
coalesce(p1.[201706],0) '201706'
FROM (
SELECT userName,Price,FORMAT(Dt,'yyyyMM') Dt
FROM T
) t
PIVOT (
SUM(Price) FOR Dt
IN ([201701],[201702],[201703],[201704],[201705],[201706])
)p1
MySQL Version
Mysql中 使用PIVOT 我們可以使用 聚集函式 + CASE WHEN表達式來達成
SELECT userName,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201701' THEN Price ELSE 0 END) `201701`,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201702' THEN Price ELSE 0 END) `201702`,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201703' THEN Price ELSE 0 END) `201703`,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201704' THEN Price ELSE 0 END) `201704`,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201705' THEN Price ELSE 0 END) `201705`,
SUM(CASE WHEN date_format(Dt,'%Y%m') = '201706' THEN Price ELSE 0 END) `201706`
FROM T
GROUP BY userName
聚集函式 + CASE WHEN 好看又通用 可在各個資料庫中使用(支援聚集函式和CASE WHEN就可用XD)
一般我在任何地方寫PIVOT 都會先使用這種方法^^
Mysql 動態產生 pivot
要動態產生Pivot表最關鍵,有兩個知識點
動態組出SQL語法
動態執行SQL語法
如果要動態執行SQL在Mysql中有三個關鍵字需要使用到
下面語法是動態產生SQL語法給@sql變數
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN ''',
date_format(Dt,'%Y%m'),
''' THEN Price ELSE 0 END) AS `',
date_format(Dt,'%Y%m'), '`'
)
) INTO @sql
FROM T;
SET @sql = CONCAT('SELECT userName, ', @sql, '
FROM T
GROUP BY userName;');
產生SQL如下
SELECT userName, SUM(CASE WHEN '201701' THEN Price ELSE 0 END) AS `201701`,SUM(CASE WHEN '201703' THEN Price ELSE 0 END) AS `201703`,SUM(CASE WHEN '201704' THEN Price ELSE 0 END) AS `201704`,SUM(CASE WHEN '201705' THEN Price ELSE 0 END) AS `201705`
FROM T
GROUP BY userName;
最後在動態執行SQL使用
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
完整SQL如下
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN ''',
date_format(Dt,'%Y%m'),
''' THEN Price ELSE 0 END) AS `',
date_format(Dt,'%Y%m'), '`'
)
) INTO @sql
FROM T;
SET @sql = CONCAT('SELECT userName, ', @sql, '
FROM T
GROUP BY userName;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
如果本文對您幫助很大,可街口支付斗內鼓勵石頭^^
MySql Povit,[MySQL|Postgresql] Pivot 通用技巧相关推荐
- 将你的网站从MySQL改为PostgreSQL
我的站点最初是采用PHP驱动,由MySQL数据库支持的方案,这在当时是一个明智的方案.在2001年夏天,我将我的数据库换成了PostgreSQL(有时也简称为Postgres). 这个教程分为两部分, ...
- 国产数据库发展十策(三):是走MySQL路线还是PostgreSQL路线?
点击蓝字 关注我们 国产数据库的发展中,毫无疑问,通过借鉴先行者的经验,我们可以获得一定的后发优势.经过四十年的探索,国产数据库形成了三大源头:购买闭源代码吸收,依托开源代码迭代,自主研发从头开始.而 ...
- mysql 改表面_MySQL_解析MySQL数据库性能优化的六大技巧,数据库表表面上存在索引和防 - phpStudy...
解析MySQL数据库性能优化的六大技巧 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间.Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕.如果你是个数据库管理员 ...
- Mysql迁移到Postgresql
使用DBConvert数据库转换工具 (1)创建两个数据库连接.一个Mysql,一个Postgresql (2)选择模式.定义那个是Master,那个是Slave. (3)同步开始 注意:DBConv ...
- mysql命令行的一些小技巧
mysql命令行的一些小技巧 1.以html格式输出结果 使用mysql客户端的参数–html或者-T,则所有SQL的查询结果会自动生成为html的table代码 $ mysql -uroot --h ...
- 2022数据库排行榜新鲜出炉!MySQL大势已去,PostgreSQL即将崛起!
文 | 局长 出品 | OSC开源社区(ID:oschina2013) DB-Engines 数据库流行度排行榜发布了 3 月份的更新. 三巨头 Oracle.MySQL 和 Microsoft SQ ...
- mysql8 vs postgresql_“王者对战”之 MySQL 8 vs PostgreSQL 10
既然 MySQL 8 和 PostgreSQL 10 已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的. 在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,也因其 ...
- [转帖] “王者对战”之 MySQL 8 vs PostgreSQL 10
原贴地址:https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10?lang=chs&page=2# 英文原版地址 ...
- MySQL 性能调优和优化技巧
介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...
最新文章
- How to Convert Array to ArrayList in Java?
- Service-policy 的出入(QOS)
- python正则匹配ip地址_Python正则表达式匹配和提取IP地址
- SQL Activity Monitor
- 其实企业的C++人最清楚企业的问题
- 【AI视野·今日Robot 机器人论文速览 第五期】Thu, 10 Jun 2021
- 数仓数据分层(ODS DWD DWS ADS)
- the catalina_home environment variable
- 算法 Tricks(四)—— 获取一个数二进制形式第一个不为 0 的位置
- php5中文手册 pdf_tp5.0完全开发手册
- keeplive使用
- 微信怎么开直播卖货?
- 金蝶凭证序时簿在哪_金蝶KIS旗舰版外购入库单序时簿界面没有凭证的按钮
- 有效提排名!2022 年最全App应用市场优化(ASO)策略
- 江苏省人力资源社会保障厅 省职称办 关于做好2021年度职称评审工作的通知
- 2022牛客寒假算法基础集训营1
- 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)
- 三次指数平滑法(Holt-Winters)
- #2021暑假杭电多校8_1003.Ink on paper
- 机器学习:线性回归以及非线性回归
热门文章
- 区块链之旅(二)以太坊、超级账本、公链、联盟链
- 解决maya2020阿诺德渲染器保存图像存在色差变暗的情况或问题
- 编译Android项目的时候提示非法字符:“\ufeff”的解决方法
- 微信小程序,自定义导航栏组件
- Firewalld防火墙 常见命令
- c语言中英文翻译 毕业设计,c语言中英文翻译资料 毕业论文(设计).doc
- 两种安装MinGW的方法
- 求最大公约数和最小公倍数
- 集合各类运算c语言,集合的并交运算(C语言).doc
- 2022春秋杯-被带走的机密文件