在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 通用技巧相关推荐

  1. 将你的网站从MySQL改为PostgreSQL

    我的站点最初是采用PHP驱动,由MySQL数据库支持的方案,这在当时是一个明智的方案.在2001年夏天,我将我的数据库换成了PostgreSQL(有时也简称为Postgres). 这个教程分为两部分, ...

  2. 国产数据库发展十策(三):是走MySQL路线还是PostgreSQL路线?

    点击蓝字 关注我们 国产数据库的发展中,毫无疑问,通过借鉴先行者的经验,我们可以获得一定的后发优势.经过四十年的探索,国产数据库形成了三大源头:购买闭源代码吸收,依托开源代码迭代,自主研发从头开始.而 ...

  3. mysql 改表面_MySQL_解析MySQL数据库性能优化的六大技巧,数据库表表面上存在索引和防 - phpStudy...

    解析MySQL数据库性能优化的六大技巧 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间.Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕.如果你是个数据库管理员 ...

  4. Mysql迁移到Postgresql

    使用DBConvert数据库转换工具 (1)创建两个数据库连接.一个Mysql,一个Postgresql (2)选择模式.定义那个是Master,那个是Slave. (3)同步开始 注意:DBConv ...

  5. mysql命令行的一些小技巧

    mysql命令行的一些小技巧 1.以html格式输出结果 使用mysql客户端的参数–html或者-T,则所有SQL的查询结果会自动生成为html的table代码 $ mysql -uroot --h ...

  6. 2022数据库排行榜新鲜出炉!MySQL大势已去,PostgreSQL即将崛起!

    文 | 局长 出品 | OSC开源社区(ID:oschina2013) DB-Engines 数据库流行度排行榜发布了 3 月份的更新. 三巨头 Oracle.MySQL 和 Microsoft SQ ...

  7. mysql8 vs postgresql_“王者对战”之 MySQL 8 vs PostgreSQL 10

    既然 MySQL 8 和 PostgreSQL 10 已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的. 在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,也因其 ...

  8. [转帖] “王者对战”之 MySQL 8 vs PostgreSQL 10

    原贴地址:https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10?lang=chs&page=2# 英文原版地址 ...

  9. MySQL 性能调优和优化技巧

    介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...

最新文章

  1. How to Convert Array to ArrayList in Java?
  2. Service-policy 的出入(QOS)
  3. python正则匹配ip地址_Python正则表达式匹配和提取IP地址
  4. SQL Activity Monitor
  5. 其实企业的C++人最清楚企业的问题
  6. 【AI视野·今日Robot 机器人论文速览 第五期】Thu, 10 Jun 2021
  7. 数仓数据分层(ODS DWD DWS ADS)
  8. the catalina_home environment variable
  9. 算法 Tricks(四)—— 获取一个数二进制形式第一个不为 0 的位置
  10. php5中文手册 pdf_tp5.0完全开发手册
  11. keeplive使用
  12. 微信怎么开直播卖货?
  13. 金蝶凭证序时簿在哪_金蝶KIS旗舰版外购入库单序时簿界面没有凭证的按钮
  14. 有效提排名!2022 年最全App应用市场优化(ASO)策略
  15. 江苏省人力资源社会保障厅 省职称办 关于做好2021年度职称评审工作的通知
  16. 2022牛客寒假算法基础集训营1
  17. 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)
  18. 三次指数平滑法(Holt-Winters)
  19. #2021暑假杭电多校8_1003.Ink on paper
  20. 机器学习:线性回归以及非线性回归

热门文章

  1. 区块链之旅(二)以太坊、超级账本、公链、联盟链
  2. 解决maya2020阿诺德渲染器保存图像存在色差变暗的情况或问题
  3. 编译Android项目的时候提示非法字符:“\ufeff”的解决方法
  4. 微信小程序,自定义导航栏组件
  5. Firewalld防火墙 常见命令
  6. c语言中英文翻译 毕业设计,c语言中英文翻译资料 毕业论文(设计).doc
  7. 两种安装MinGW的方法
  8. 求最大公约数和最小公倍数
  9. 集合各类运算c语言,集合的并交运算(C语言).doc
  10. 2022春秋杯-被带走的机密文件