MySQL,排序,统计行转列


-- ----------------------------
-- Table structure for a
-- ----------------------------

DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
  `type` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `val` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of a
-- ----------------------------

INSERT INTO `a` VALUES (‘x‘, ‘A‘, ‘1‘);
INSERT INTO `a` VALUES (‘x‘, ‘B‘, ‘2‘);
INSERT INTO `a` VALUES (‘x‘, ‘C‘, ‘2‘);
INSERT INTO `a` VALUES (‘x‘, ‘A‘, ‘4‘);
INSERT INTO `a` VALUES (‘y‘, ‘B‘, ‘5‘);
INSERT INTO `a` VALUES (‘y‘, ‘C‘, ‘5‘);
INSERT INTO `a` VALUES (‘y‘, ‘D‘, ‘5‘);
INSERT INTO `a` VALUES (‘z‘, ‘A‘, ‘8‘);
INSERT INTO `a` VALUES (‘z‘, ‘B‘, ‘9‘);
INSERT INTO `a` VALUES (‘x‘, ‘C‘, ‘1‘);
INSERT INTO `a` VALUES (‘x‘, ‘D‘, ‘2‘);
INSERT INTO `a` VALUES (‘y‘, ‘D‘, ‘3‘);
INSERT INTO `a` VALUES (‘y‘, ‘D‘, ‘4‘);
INSERT INTO `a` VALUES (‘z‘, ‘C‘, ‘5‘);
INSERT INTO `a` VALUES (‘z‘, ‘C‘, ‘6‘);
INSERT INTO `a` VALUES (‘z‘, ‘C‘, ‘2‘);
INSERT INTO `a` VALUES (‘z‘, ‘A‘, ‘4‘);

SQL语句

-- 序号、排名
select @rownum:[email protected]+1 xh,a.name,a.val,
if(@lastVal=a.val,@rank,@rank:[email protected])pm,@lastVal:=a.val
from  a,(select @rownum:=0,@rank:=0,@lastVal:=null) b ORDER BY a.val;
-- 统计为行
select type,name,sum(val) from a GROUP BY a.type,a.name;
-- 统计为行列
select t.type,if(t.name=‘A‘,t.sl,0)A,if(t.name=‘B‘,t.sl,0)B,if(t.name=‘C‘,t.sl,0)C,if(t.name=‘D‘,t.sl,0)D from
(select type,name,sum(val)sl from a GROUP BY a.type,a.name)t;
-- 行转列,方式1
select t1.type,sum(A) sumA,sum(B) sumB,sum(C) sumC,sum(D) sumD from
(select t.type,if(t.name=‘A‘,t.sl,0)A,if(t.name=‘B‘,t.sl,0)B,if(t.name=‘C‘,t.sl,0)C,if(t.name=‘D‘,t.sl,0)D from
(select type,name,sum(val)sl from a GROUP BY a.type,a.name)t)t1 group by t1.type;
-- 行转列,方式2
select t.type,sum(if(t.name=‘a‘,t.sl,0)) sumA,sum(if(t.name=‘b‘,t.sl,0)) sumB,sum(if(t.name=‘c‘,t.sl,0)) sumC,sum(if(t.name=‘d‘,t.sl,0)) sumD from
(select type,name,sum(val)sl from a GROUP BY a.type,a.name)t group by t.type;

 结果图片

时间: 2024-11-05 12:10:07

MySQL,排序,统计行转列的相关文章

MySQL 如何实现行转列分级输出?

概述 好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下. 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键).本文以MySQL为基础,其他数据库会有些许语法不同. 数据库表数据: 处理后的结果(行转列): 方法一: 这里可以使用Max,也可以使用Sum: 注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null; 

MySQL查询结果行转列、列转行

一.行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCR

mysql中的行转列

//查看当前商品库存 function checkProductStock($product_id){ global $wpdb; $sql="SELECT post_id,max(if((meta_key = '_stock_status'),meta_value,'')) AS stock_status,//此方法的作用 max(if((meta_key = '_manage_stock'),meta_value,'')) AS manage_stock, max(if((meta_key

[MySQL] 行列转换变化各种方法实现总结(行变列报表统计、列变行数据记录统计等)

前言: mysql行列变化,最难的就是将多个列变成多行,使用的比较多的是统计学中行变列,列变行,没有找到现成的函数或者语句,所以自己写了存储过程,使用动态sql来实现,应用业务场景,用户每个月都有使用记录数录入一张表,一个月一个字段,所以表的字段是动态增长的,现在需要实时统计当前用户使用的总数量,如果你知道有多少个字段,那么可以用select c1+c2+c3+-. From tbname where tid='111';来实现,但是关键是这个都是动态的,所以在应用程序端来实现确实不适宜,可以放

Mysql 列转行统计查询 、行转列统计查询

之前看过一篇博文写得非常好,看后就很容易让人理解,博文地址为:http://www.cnblogs.com/lhj588/p/3315876.html 最近在群里又碰到一个朋友说起,于是记录一下: 假设表名为t.表里有六个字段p1,p2,p3,s1,s2,s3 现在想得到 p1=100 时s1值的总和 p2=100 时s2值的总和 p3=100 时s3值的总和 创建表: CREATE TABLE `t` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `s

Mysql或者Hive数据行变成列

对于mysql /  hive 再进行统计的时候如果需要行变成列,可以使用函数 CASE 字段a WHEN 值b THEN c [WHEN d THEN e]* [ELSE f] END 当字段a=值b时,返回c(如果是字段的话则代表该字段的值,也可以是一个固定值 加单引号就可以):当a=d时,返回e,否则返回f. 如: 数据表结构:(举例说明,id有重复的) select id ,sum(CASE action when 'article' then count else 0 end) as

C语言之基本算法42—矩阵转置及按行按列排序

//矩阵转置 按行按列排序 /* ================================================================== 题目:输入m*n矩阵,按行升序排列输出. 输入: 4 3 5 6 2 9 8 1 2 8 7 1 2 3 8 输出: 2 3 4 5 6 1 2 8 8 9 1 2 3 7 8 ================================================================== */ #includ

python 按二维数组的某行或列排序 (numpy lexsort)

lexsort支持对数组按指定行或列的顺序排序:是间接排序,lexsort不修改原数组,返回索引. 默认按最后一行元素有小到大排序, 返回最后一行元素排序后索引所在位置. 设数组a, 返回的索引ind, a可以是1维或2维数组,ind返回的是一维数组 对于一维数组, a[ind]就是排序后的数组. 对于二维数组下面会详细举例. import numpy as np >>> a array([[ 2,  7,  4,  2], [35,  9,  1,  5], [22, 12,  3, 

Mysql 行转列

select * from t_zg_asset_statistic_info a where a.BATCH_NO='ss20170123181418' ; 这是原始数据: 这是行转列后的样子: select a.DEBT_TYPE, sum(case WHEN DEBT_TYPE ='0' THEN AMOUNT END) '初债', sum(case WHEN DEBT_TYPE ='1' THEN AMOUNT END) '二级债' , CONVERT(group_concat(DEBT