MySQL使用控制语句实现行转列的几个实践

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL使用控制语句实现行转列的几个实践

案例背景:按周统计周中每天销售额。

要求结果如下图所示:



【1】子查询

SELECT
  week_year,
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 2
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Monday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 3
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Tuesday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 4
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Wednesday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 5
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Thursday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 6
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Friday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 7
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Saturday',
  (
    SELECT
      SUM(net_price)
    FROM
      goods_sale
    WHERE
      day_week = 1
    AND week_year = gs.week_year
    AND year_num = 2016
  ) AS 'Sunday'
FROM
  goods_sale gs
WHERE
  1 = 1
AND year_num = 2016
GROUP BY
  gs.week_year;

抛开表分区不谈,这种方式效率很低。结果如下图所示,耗时167.180S:


【2】IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。

实例如下:

SELECT
  gs.week_year,
  sum(if(gs.day_week=1,gs.net_price,0)) AS 'Sunday',
  sum(if(gs.day_week=2,gs.net_price,0)) AS 'Monday',
  sum(if(gs.day_week=3,gs.net_price,0)) AS 'Tuesday',
  sum(if(gs.day_week=4,gs.net_price,0)) AS 'Wednesday',
  sum(if(gs.day_week=5,gs.net_price,0)) AS 'Thursday',
  sum(if(gs.day_week=6,gs.net_price,0)) AS 'Friday',
  sum(if(gs.day_week=7,gs.net_price,0)) AS 'Saturday',
  sum(gs.net_price)
FROM
  goods_sale gs
WHERE
  1 = 1
AND gs.year_num = 2016
GROUP BY
  gs.week_year

效率显然比第一种方式(子查询)要高,结果如下(耗时0.119S):


【3】CASE…WEHN…THEN…ELSE…END

实例如下 :

SELECT
  week_year,
  SUM(
    (
      CASE gs.day_week
      WHEN 1 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Sunday,
  SUM(
    (
      CASE gs.day_week
      WHEN 2 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Monday,
  SUM(
    (
      CASE gs.day_week
      WHEN 3 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Tuesday,
  SUM(
    (
      CASE gs.day_week
      WHEN 4 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Wednesday,
  SUM(
    (
      CASE gs.day_week
      WHEN 5 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Thursday,
  SUM(
    (
      CASE gs.day_week
      WHEN 6 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Friday,
  SUM(
    (
      CASE gs.day_week
      WHEN 7 THEN
        gs.net_price
      ELSE
        0
      END
    )
  ) Saturday,
  SUM(gs.net_price)
FROM
  goods_sale gs
WHERE
  year_num = 2016
GROUP BY
  week_year

效率比子查询显然快。结果如下,耗时0.101S:

综上,MySQL行转列时,要综合考虑运用函数提高效率!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
171 5
|
2月前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
73 0
|
2月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发:从基础到实践####
本文将深入探讨PHP与MySQL的结合使用,展示如何构建一个动态网站。通过一系列实例和代码片段,我们将逐步了解数据库连接、数据操作、用户输入处理及安全防护等关键技术点。无论您是初学者还是有经验的开发者,都能从中获益匪浅。 ####
|
3月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
115 2
|
3月前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
114 1
|
3月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
253 3
|
4月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
225 9
|
4月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
307 0
|
5月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
6月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
313 0