在你找工作的经历当中,是否有面试官问过你:数据库行转列如何实现?
一个典型的例子如下:
有这样一个订单表(om_order)一条记录包含订单号、创建日期、订单总金额;
让你统计不同年份对应各月份的销售情况,要求每一年的销售情况一行展示,效果如下:
+--------+-------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+--------------+
| 年份 | 一月 | 二月 | 三月 | 四月 | 五月 | 六月 | 七月 | 八月 | 九月 | 十月 | 十一月 | 十二月 |
+--------+-------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+--------------+
| 2011 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 157791865.93 |
| 2012 | 59793317.04 | 0.00 | 79342.20 | 38757.74 | 45519.50 | 24669.33 | 49387.64 | 23206.87 | 10314.14 | 26005.00 | 60958.59 | 6386.90 |
+--------+-------------+--------+----------+----------+----------+----------+----------+----------+----------+----------+-----------+--------------+
// 表结构如下:
create table if not exists om_order(
Order_No int primary key,
Create_Date datetime,
Order_Sum decimal(18,2)
);
好了,如何实现想要的效果呢?
要一步实现确实很有点困难,我们一步一步分析,先不考虑一行展示所有月份数据,我们先按照常规统计(列的形式)来展示每月销售情况,sql如下:
select year(o.`Create_Date`) as '年份',month(o.`Create_Date`) as '月份',sum(`Order_Sum`) as '订单销售额' from `om_order` o
-- where year(o.`Create_Date`) = '2012'
group by year(o.`Create_Date`),month(o.`Create_Date`);
有了这样的数据后结果后在处理就是单纯的行转列了,sql如下:
select tmp.o_year as '年份',
sum(case when tmp.o_month = 1 then tmp.o_total else 0 end) as '一月',
sum(case when tmp.o_month = 2 then tmp.o_total else 0 end) as '二月',
sum(case when tmp.o_month = 3 then tmp.o_total else 0 end) as '三月',
sum(case when tmp.o_month = 4 then tmp.o_total else 0 end) as '四月',
sum(case when tmp.o_month = 5 then tmp.o_total else 0 end) as '五月',
sum(case when tmp.o_month = 6 then tmp.o_total else 0 end) as '六月',
sum(case when tmp.o_month = 7 then tmp.o_total else 0 end) as '七月',
sum(case when tmp.o_month = 8 then tmp.o_total else 0 end) as '八月',
sum(case when tmp.o_month = 9 then tmp.o_total else 0 end) as '九月',
sum(case when tmp.o_month = 10 then tmp.o_total else 0 end) as '十月',
sum(case when tmp.o_month = 11 then tmp.o_total else 0 end) as '十一月',
sum(case when tmp.o_month = 12 then tmp.o_total else 0 end) as '十二月'/*,
sum(tmp.o_total) as '总计'*/
from
(
select year(o.`Create_Date`) as o_year,month(o.`Create_Date`) as o_month,sum(`Order_Sum`) as o_total from `om_order` o
group by year(o.`Create_Date`),month(o.`Create_Date`)
) tmp
group by tmp.o_year;
好了,大功告成!
分享到:
相关推荐
MySQL 行转列是一种常用的数据处理操作,用于将同一列下的不同内容的几行数据转换成几列显示。例如,我们有一个成绩表 tb_score,其中包含 userid、subject 和 score 三个字段。我们可以使用 CASE WHEN 语句或 IF ...
在数据库管理中,MySQL是一个广泛使用的开源关系型数据库系统,其功能强大且灵活。...总的来说,理解和掌握行转列与列转行的技巧,能够帮助我们更好地利用MySQL处理复杂的数据需求,提升数据分析和决策的效率。
MySQL 动态行转列是指将行数据转换为列数据的过程。在 MySQL 中,可以使用存储过程来实现动态行转列。下面是两个示例存储过程,演示如何使用 MySQL 实现动态行转列。 存储过程一: 该存储过程使用 While 循环来...
MySQL 提供了两种转换数据布局的方法:行转列(Pivot)和列转行(Unpivot),这在处理复杂的数据汇总和展示时非常有用。本文将深入探讨这两种转换方法,并提供具体的 SQL 语句示例,以及创建示例表结构的 SQL 代码。...
总之,MySQL中的行转列是数据分析过程中的一种重要技巧,尤其对于处理时间序列数据和分类统计时非常实用。通过灵活运用`CASE`和`GROUP BY`,我们可以将原始数据整理成更符合报告需求的形式,从而更好地理解业务情况...
MySQL行转列示例代码,备忘,作为需要用时的参考
在数据库管理领域,数据转换是一项常见且重要的任务,其中“行转列”(Pivot)是一种将表格数据从行格式转换为列格式的技术,尤其在处理汇总数据、数据分析或报表生成时极为有用。本文将深入探讨MySQL中的行转列算法...
当我们在处理数据时,有时会遇到需要将多行数据转换为一列的情况,这被称为“行转列”操作。在本篇中,我们将深入探讨如何在MySQL中解决复杂的动态行转列问题。 首先,我们要理解行转列的基本概念。在传统的SQL查询...
mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中,mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中 mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储...
### MySQL行转列与列转行详解 #### 行转列 在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个...
在SQL数据库操作中,"行转列"是一种常见的数据转换需求,它将表格中的多行数据转换为单列显示,通常用于数据汇总和分析。在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在...
在 MySQL 中,可以使用以下方法来将 SQL 数据表的一列转换为一行。 知识点1:使用存储过程实现数据转换 在 MySQL 中,可以使用存储过程来实现数据转换。存储过程是一种预先编译好的 SQL 语句集合,可以重复使用以...
MySQL 数据集是数据库管理系统中一个重要的概念,它指的是在 SQL 查询语句中形成的临时或永久性的数据集合。在本篇文章中,我们将深入探讨 MySQL 数据集的相关知识点,包括数据集的生成、操作以及优化策略。 首先,...
本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...
### DataX 数据从 Hive 导入 MySQL 数据缺失解决 #### 背景介绍 在大数据处理领域,Hive 和 MySQL 分别作为数据仓库与关系型数据库的重要组成部分,在数据流转过程中承担着关键角色。Hive 通常用于存储海量数据并...
MySQL 提供了一些方法来实现行转列和列转行的操作。本文将通过实例详细讲解这两种转换方式。 首先,我们来看行转列。行转列通常用于将具有多个相关值的同一列数据展示为多列。在 MySQL 中,可以使用 CASE 语句配合...
总结一下,"MySQL数据生成JSON数据"这个过程涉及以下知识点: 1. MySQL数据库的连接配置。 2. SQL查询语言,包括选择特定数据表和使用`LIMIT`子句限制返回的记录数。 3. MySQL中的JSON函数,如`JSON_ARRAY()`、`JSON...