- 浏览: 323828 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
lst923:
...
java 实现图片裁剪 -
kakarottoz:
多谢博主分享,正好用到!
java 实现图片裁剪 -
Vcb:
http://osgi.jxtech.net 是一个完全基于O ...
OSGi介绍 -
Vcb:
是一个完全基于OSGi的开发平台,有在线演示,免费插件可供下 ...
OSGi介绍 -
mikey_5:
谢谢分享,原来设置: style="word-bre ...
td内容自动换行
网上查到,留作记录
数据样本:
create table tx(
id int primary key,
c1 char(2),
c2 char(2),
c3 int
);
insert into tx values
(1 ,'A1','B1',9),
(2 ,'A2','B1',7),
(3 ,'A3','B1',4),
(4 ,'A4','B1',2),
(5 ,'A1','B2',2),
(6 ,'A2','B2',9),
(7 ,'A3','B2',8),
(8 ,'A4','B2',5),
(9 ,'A1','B3',1),
(10 ,'A2','B3',8),
(11 ,'A3','B3',8),
(12 ,'A4','B3',6),
(13 ,'A1','B4',8),
(14 ,'A2','B4',2),
(15 ,'A3','B4',6),
(16 ,'A4','B4',9),
(17 ,'A1','B4',3),
(18 ,'A2','B4',5),
(19 ,'A3','B4',2),
(20 ,'A4','B4',5);
mysql> select * from tx;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | A1 | B1 | 9 |
| 2 | A2 | B1 | 7 |
| 3 | A3 | B1 | 4 |
| 4 | A4 | B1 | 2 |
| 5 | A1 | B2 | 2 |
| 6 | A2 | B2 | 9 |
| 7 | A3 | B2 | 8 |
| 8 | A4 | B2 | 5 |
| 9 | A1 | B3 | 1 |
| 10 | A2 | B3 | 8 |
| 11 | A3 | B3 | 8 |
| 12 | A4 | B3 | 6 |
| 13 | A1 | B4 | 8 |
| 14 | A2 | B4 | 2 |
| 15 | A3 | B4 | 6 |
| 16 | A4 | B4 | 9 |
| 17 | A1 | B4 | 3 |
| 18 | A2 | B4 | 5 |
| 19 | A3 | B4 | 2 |
| 20 | A4 | B4 | 5 |
+----+------+------+------+
20 rows in set (0.00 sec)
mysql>
期望结果
+------+-----+-----+-----+-----+------+
|C1 |B1 |B2 |B3 |B4 |Total |
+------+-----+-----+-----+-----+------+
|A1 |9 |2 |1 |11 |23 |
|A2 |7 |9 |8 |7 |31 |
|A3 |4 |8 |8 |8 |28 |
|A4 |2 |5 |6 |14 |27 |
|Total |22 |24 |23 |40 |109 |
+------+-----+-----+-----+-----+------+
1. 利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total
mysql>
SELECT
IFNULL(c1,'total') AS total,
SUM(IF(c2='B1',c3,0)) AS B1,
SUM(IF(c2='B2',c3,0)) AS B2,
SUM(IF(c2='B3',c3,0)) AS B3,
SUM(IF(c2='B4',c3,0)) AS B4,
SUM(IF(c2='total',c3,0)) AS total
FROM (
SELECT c1,IFNULL(c2,'total') AS c2,SUM(c3) AS c3
FROM tx GROUP BY c1,c2
WITH ROLLUP
HAVING c1 IS NOT NULL
) AS A
GROUP BY c1
WITH ROLLUP;
+-------+------+------+------+------+-------+
| total | B1 | B2 | B3 | B4 | total |
+-------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+-------+------+------+------+------+-------+
5 rows in set, 1 warning (0.00 sec)
2. 利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total
mysql>
select c1,
sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
from tx
group by C1
UNION
SELECT 'TOTAL',sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) FROM TX;
+-------+------+------+------+------+-------+
| c1 | B1 | B2 | B3 | B4 | TOTAL |
+-------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| TOTAL | 22 | 24 | 23 | 40 | 109 |
+-------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
3. 利用SUM(IF()) 生成列,直接生成结果不再利用子查询
mysql>
select
ifnull(c1,'total'),
sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
from tx
group by C1 with rollup ;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1 | B2 | B3 | B4 | TOTAL |
+--------------------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
4. 动态,适用于列不确定情况,
mysql> SET @EE='';
mysql> SELECT @EE:=CONCAT(@EE,'SUM(IF(C2=\'',C2,'\'',',C3,0)) AS ',C2,',') FROM (SELECT DISTINCT C2 FROM TX) A;
mysql> SET @QQ=CONCAT('SELECT ifnull(c1,\'total\'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(C3) AS TOTAL FROM TX GROUP BY C1 WITH ROLLUP');
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE stmt2 FROM @QQ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt2;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1 | B2 | B3 | B4 | TOTAL |
+--------------------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
其实数据库中也可以用 CASE WHEN / DECODE 代替 IF
sum(if(c2='B1',C3,0)) AS B1
可改写为
sum(case c2 when 'B1' then C3 else 0 end) AS B1
原文地址:http://blog.chinaunix.net/u3/90603/showart_2017912.html
数据样本:
create table tx(
id int primary key,
c1 char(2),
c2 char(2),
c3 int
);
insert into tx values
(1 ,'A1','B1',9),
(2 ,'A2','B1',7),
(3 ,'A3','B1',4),
(4 ,'A4','B1',2),
(5 ,'A1','B2',2),
(6 ,'A2','B2',9),
(7 ,'A3','B2',8),
(8 ,'A4','B2',5),
(9 ,'A1','B3',1),
(10 ,'A2','B3',8),
(11 ,'A3','B3',8),
(12 ,'A4','B3',6),
(13 ,'A1','B4',8),
(14 ,'A2','B4',2),
(15 ,'A3','B4',6),
(16 ,'A4','B4',9),
(17 ,'A1','B4',3),
(18 ,'A2','B4',5),
(19 ,'A3','B4',2),
(20 ,'A4','B4',5);
mysql> select * from tx;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | A1 | B1 | 9 |
| 2 | A2 | B1 | 7 |
| 3 | A3 | B1 | 4 |
| 4 | A4 | B1 | 2 |
| 5 | A1 | B2 | 2 |
| 6 | A2 | B2 | 9 |
| 7 | A3 | B2 | 8 |
| 8 | A4 | B2 | 5 |
| 9 | A1 | B3 | 1 |
| 10 | A2 | B3 | 8 |
| 11 | A3 | B3 | 8 |
| 12 | A4 | B3 | 6 |
| 13 | A1 | B4 | 8 |
| 14 | A2 | B4 | 2 |
| 15 | A3 | B4 | 6 |
| 16 | A4 | B4 | 9 |
| 17 | A1 | B4 | 3 |
| 18 | A2 | B4 | 5 |
| 19 | A3 | B4 | 2 |
| 20 | A4 | B4 | 5 |
+----+------+------+------+
20 rows in set (0.00 sec)
mysql>
期望结果
+------+-----+-----+-----+-----+------+
|C1 |B1 |B2 |B3 |B4 |Total |
+------+-----+-----+-----+-----+------+
|A1 |9 |2 |1 |11 |23 |
|A2 |7 |9 |8 |7 |31 |
|A3 |4 |8 |8 |8 |28 |
|A4 |2 |5 |6 |14 |27 |
|Total |22 |24 |23 |40 |109 |
+------+-----+-----+-----+-----+------+
1. 利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total
mysql>
SELECT
IFNULL(c1,'total') AS total,
SUM(IF(c2='B1',c3,0)) AS B1,
SUM(IF(c2='B2',c3,0)) AS B2,
SUM(IF(c2='B3',c3,0)) AS B3,
SUM(IF(c2='B4',c3,0)) AS B4,
SUM(IF(c2='total',c3,0)) AS total
FROM (
SELECT c1,IFNULL(c2,'total') AS c2,SUM(c3) AS c3
FROM tx GROUP BY c1,c2
WITH ROLLUP
HAVING c1 IS NOT NULL
) AS A
GROUP BY c1
WITH ROLLUP;
+-------+------+------+------+------+-------+
| total | B1 | B2 | B3 | B4 | total |
+-------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+-------+------+------+------+------+-------+
5 rows in set, 1 warning (0.00 sec)
2. 利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total
mysql>
select c1,
sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
from tx
group by C1
UNION
SELECT 'TOTAL',sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) FROM TX;
+-------+------+------+------+------+-------+
| c1 | B1 | B2 | B3 | B4 | TOTAL |
+-------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| TOTAL | 22 | 24 | 23 | 40 | 109 |
+-------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
3. 利用SUM(IF()) 生成列,直接生成结果不再利用子查询
mysql>
select
ifnull(c1,'total'),
sum(if(c2='B1',C3,0)) AS B1,
sum(if(c2='B2',C3,0)) AS B2,
sum(if(c2='B3',C3,0)) AS B3,
sum(if(c2='B4',C3,0)) AS B4,SUM(C3) AS TOTAL
from tx
group by C1 with rollup ;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1 | B2 | B3 | B4 | TOTAL |
+--------------------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
4. 动态,适用于列不确定情况,
mysql> SET @EE='';
mysql> SELECT @EE:=CONCAT(@EE,'SUM(IF(C2=\'',C2,'\'',',C3,0)) AS ',C2,',') FROM (SELECT DISTINCT C2 FROM TX) A;
mysql> SET @QQ=CONCAT('SELECT ifnull(c1,\'total\'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(C3) AS TOTAL FROM TX GROUP BY C1 WITH ROLLUP');
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE stmt2 FROM @QQ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt2;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1 | B2 | B3 | B4 | TOTAL |
+--------------------+------+------+------+------+-------+
| A1 | 9 | 2 | 1 | 11 | 23 |
| A2 | 7 | 9 | 8 | 7 | 31 |
| A3 | 4 | 8 | 8 | 8 | 28 |
| A4 | 2 | 5 | 6 | 14 | 27 |
| total | 22 | 24 | 23 | 40 | 109 |
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
其实数据库中也可以用 CASE WHEN / DECODE 代替 IF
sum(if(c2='B1',C3,0)) AS B1
可改写为
sum(case c2 when 'B1' then C3 else 0 end) AS B1
原文地址:http://blog.chinaunix.net/u3/90603/showart_2017912.html
发表评论
-
hibernate集合映射inverse和cascade详解
2013-05-04 12:14 950网上转载,出处不详 1、到底在哪用cascade=" ... -
js取el中的map值及js replaceAll实现
2013-04-10 15:55 2282<% Map map = new HashMap(); ... -
Struts2返回结果类型
2013-04-03 15:35 976转自:http://blog.csdn.net/sleepin ... -
Hibernate实体注解
2013-04-03 15:29 1124转自:http://blog.csdn.net/sleepin ... -
eclipse jee + tomcat记要
2013-03-08 15:37 2780今天重新下了个eclipse-jee-helios-SR2-w ... -
Hibernate主键生成策略
2013-01-28 15:50 8701) assigned 主键由外部程 ... -
tomcat调整内存大小
2012-11-14 14:15 1013Tomcat6使用安装版本进行安装后,使用内存的调整无法利用修 ... -
jstl与 jsp脚本间的数据传递
2012-11-08 13:34 1051可能这个标题没有确切表达我的意思,直接说用处 后台把一个对象, ... -
mysql忘记密码的解决
2012-10-26 13:42 965留作笔记 转:http://baalwolf.iteye.c ... -
spring RMI rmoting远程服务实例
2012-10-25 14:39 1392还没有测试,先留在这儿,转自http://www.walker ... -
mysql解压版安装
2012-09-20 15:30 1101http://www.php100.com/html/webk ... -
MYSQL常用命令(转)
2012-09-04 20:48 972平时都是用客户端工具,偶尔临时需操作下,装个客户端实显麻烦,特 ... -
hibernate条件查询
2012-08-15 10:43 12501. Criteria criteria = getSessi ... -
一个分号引发的"血案"
2012-08-14 16:29 1221我用hibernate的SQLQuery做查询,sql是拼出来 ... -
struts 文件下载
2012-07-19 11:17 922以下代码是struts1中的action中 一般下载有三种方式 ... -
struts1 forward 请求带参数
2012-07-18 10:40 1815如果action配置中,加了scope="reque ... -
struts1 初始化
2012-07-18 10:08 1490好久不用这了,现在项目用到,回忆下struts1的基础 一 ... -
A Different Object With The Same Identifier Value Was Already Associated With Th
2012-07-05 14:38 814getHibernateTemplate().merge(ob ... -
解压版Tomcat服务
2012-06-21 11:47 1399本文来自http://my.oschina.n ... -
Jboss的安装与使用
2012-06-21 11:48 11671、 安装 1.1、软件安 ...
相关推荐
本篇文章将深入探讨“MySQL 查询行列转换”的概念及其实际应用,这在数据分析和报表展示时尤其重要。 行转列是数据处理中的常见需求,尤其是在数据透视或汇总分析时。在 MySQL 中,我们可以使用几种方法实现这一...
在MySQL中,行列转换是一种常见的数据处理需求,特别是在数据分析和报表生成时。列联表(Cross Tabulation)和交叉表(Pivot Table)是这种转换的两种术语,它们用于将行数据转换为列数据,或者反之。在描述的场景中...
不过,MySQL提供了其他方法来实现行列转换。本文将通过两个示例讲解如何在MySQL中进行行列转换。 **示例一:使用CASE语句** 在MySQL中,可以利用`CASE`语句配合`SUM`或`GROUP BY`来实现行列转换。这种方法适用于...
MySQL 动态行转列是指将数据库中的一行数据转换为多列数据的过程。在本示例中,我们将创建一个存储过程来实现动态行转列,用于从数据库中提取指定学生的成绩信息。 描述解释 MySQL 数据库中存在一个问题,即如何将...
MySQL 行转列、列转行、行列汇总、合并显示 MySQL 行转列是一种常用的数据处理操作,用于将同一列下的不同内容的几行数据转换成几列显示。例如,我们有一个成绩表 tb_score,其中包含 userid、subject 和 score 三...
数据处理阶段主要是对读取到的数据进行业务逻辑处理,如字符串处理、类型转换和正则表达式应用。这部分依赖于具体的业务需求,因此没有统一的代码示例。建议确保C#基础扎实,掌握正则表达式的高效编写,以提升处理...
在SQL数据库操作中,行与列的转换是常见的数据处理需求。这通常涉及到将一列的数据拆分成多行,或者将多行数据合并为一列。这种操作在数据分析、报表生成以及数据清洗过程中非常常见。在SQL Server中,我们可以利用...
在MySQL数据库中,有时我们需要将数据表中的列转换为行,这一操作通常称为"行列转换"或"行列互换",在SQL语句中可以通过多种方法实现,如使用CASE语句、UNION ALL或者自连接等。在这个实例中,我们重点关注的是通过...
这种操作在SQL中通常被称为“透视”或“行列转换”。 标题“mysql-行转列、列转行”涉及到的是MySQL中的两种主要转换技巧: 1. **行转列(Pivot)**: 行转列通常用于将多行数据转换为单行的多个列。在MySQL中,...
在SQL中,对数据进行行列转换是数据分析过程中常见的需求,特别是在报表展示或数据汇总时。本文将详细探讨两种实现这一转换的方法:`CASE...WHEN` 和 `PIVOT` 函数,通过具体的示例来解析它们的用法。 1. `CASE......
在数据分析和报表生成时,有时我们需要将数据从行格式转换为列格式,这在SQL中通常被称为“行列转换”。本篇内容主要围绕如何在MySQL中实现行转列,特别是针对商家月额统计这一具体场景进行探讨。 首先,我们要理解...
MYSQL子查询、相关子查询、inner join、left|right join、cross join 、行列转换等高级查询练习题
MYSQL高级特性 81 4.1 集合函数 82 4.1.1 行列计数 82 4.1.2统计字段值的数目 82 4.1.3 计算字段的平均值 83 4.1.4 计算字段值的和 84 4.1.5 计算字段值的极值 84 4.1.6 总结 86 4.2 操作...
总结一下,MySQL中的行列转换主要依赖于`CASE`、`GROUP BY`、`UNION`等核心SQL语句。通过巧妙地组合运用这些语句,可以灵活地调整数据的布局,从而更好地满足数据分析和展示的需求。在进行转换时,务必注意数据的...
在数据库管理与数据分析领域,有时我们需要对表格中的数据进行特殊的处理,例如将行转换为列或将列转换为行,这样的操作被称为“行列互换”。这种需求通常出现在汇总报告、数据透视等场景下。本文将详细介绍如何在...
总结来说,本文介绍了如何在MySQL中查询一个字段中相同属性的最大值,提供了两种实用的方法,即通过行列转换和`MAX`函数,以及使用`GREATEST`函数。通过深入理解和实践这些技术,不仅可以提升SQL技能,也能在实际...
在SQL编程中,数据操作和分析常常涉及到对数据的行列转换。这是一项关键技能,尤其在处理复杂报表或数据分析任务时。"sql.rar_SQL 脚本"这个压缩包文件显然是一个关于SQL脚本的资源,其中包含了"sql.txt"这样一个...