在你找工作的经历当中,是否有面试官问过你:数据库行转列如何实现?
一个典型的例子如下:
有这样一个订单表(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行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示
mysql数据值行转列的问题
MySQL行转列示例代码,备忘,作为需要用时的参考
mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中,mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中 mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储...
本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...
datax数据从hive表导入mysql表,数据缺失解决
即一列中存储了多个属性值。如下表 pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末) 1.得到所有的不重复的值,如 value AT BT CT DT ET SQL...
mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...
本文是在6、NIFI综合应用场景-离线同步Mysql数据到HDFS中基础上完成的,仅仅是将上文中的json数据转成txt文件。本文仅列出了和该示例增加的部分,其他的则没有变化。 本文前置条件是mysql、hadoop、nifi、hive和hue...
通过C#调用CMD.exe,利用MySQL提供的数据库访问接口实现为表添加新的一列数据并给定默认值
MySQL 添加字段的语法格式如下: ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; 对语法格式的说明如下: <表名> 为数据表的名字; <新字段名> 为所要添加的字段的名字; <数据类型> 为所要添加的...
今天小编就为大家分享一篇Django读取Mysql数据并显示在前端的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
mysql可以查询根据某列按条件统计总数
利用mysql中提供的所有函数,组成的一个存储过程。此存储过程主要是将传入的字符串分割为多个值,单个列。
数据库结构转换:将MySQL的表、列、索引等结构转换为PostgreSQL的对应结构。 数据转换:将MySQL中的数据转换为PostgreSQL中的相应数据类型,并确保数据的一致性和完整性。 查询语句转换:将MySQL中的查询语句转换...
您可能感兴趣的文章:MySql采用GROUP_CONCAT合并多条数据显示的方法mysql利用group_concat()合并多行数据到一行mysql如何实现多行查询结果合并成一行关于mysql合并表的详细介绍mysql中合并两个字段的方法分享mysql...
Django2+ MySQL8 数据插入和查询 Django2+ MySQL8 数据插入和查询
sql 查出一张表中重复...2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下: select count(username) as '重复次数',username from xi group by username having count(*)>1 order by userna
MySQL海量数据查询优化策略,方法。 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引...
8 MySQL 教程 8.1 联接和断开服务器 8.2 输入查询 8.3 常用查询的例子 8.3.1 列的最大值 8.3.2 拥有某个列的最大值的行 8.3.3 列的最大值:按组:只有值 8.3.4 拥有某个字段的组间...