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,
  `s1` int(11) DEFAULT NULL,
  `s2` int(11) DEFAULT NULL,
  `s3` int(11) DEFAULT NULL,
  `p1` int(11) DEFAULT NULL,
  `p2` int(11) DEFAULT NULL,
  `p3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf-8;

添加一些数据:

insert into t value(NULL, floor(rand()%10*100),floor(rand()%10*100),floor(rand()%10*100),100,100,100);

参考答案(MYSQL行转列统计):

SELECT 
SUM(CASE p1 WHEN 100 THEN s1 ELSE 0 END) s1sum,
SUM(CASE p2 WHEN 100 THEN s2 ELSE 0 END) s2sum,
SUM(CASE p3 WHEN 100 THEN s3 ELSE 0 END) s3sum
FROM `t`;

最后自己对比下统计是否正确

select sum(s1) from t where p1 = 100;
select sum(s2) from t where p2 = 100;
select sum(s3) from t where p3 = 100;
时间: 2024-10-15 11:22:44

Mysql 列转行统计查询 、行转列统计查询的相关文章

Mysql group_concat函数列转行,与行转列

1.正常情况. SELECT JoinEventIds from user 2.使用group_concat函数得到列转行. select group_concat(JoinEventIds) from user 3.使用SUBSTRING_INDEX和CROSS JOIN将列里面的的数字都拆分出来,把一行变成一列. 方法一(网上查询的方法): 建配置表: CREATE TABLE digits (digit INT(1)); INSERT INTO digits VALUES (0), (1)

内存数据库中列转行的应用,h2中列转行,hsqldb中列转行

其实列转行是比较简单的用sum和decode函数就可以了,但是我遇到的项目,不知道数据谁设计的居然字段里面还设计成long类型,此long类型与java中的不同,oracle中的long是指可变长二进制数据,最长2G,哎没办法只好转换了. 以下是hsqldb的转换,用到了转换函数convert,可以将long类型的转换为double类型,其中d.value是long类型,status是int类型,所以value需要转换 SELECT P.NAME,P.ID, SUM(DECODE(D.K_NAM

C#动态操作DataTable(新增行、列、查询行、列等)

方法一:动态创建一个DataTable ,并为其添加数据 public void CreateTable()        {            //创建表            DataTable dt = new DataTable();                        //1.添加列            dt.Columns.Add("Name", typeof(string)); //数据类型为 文本 //2.通过列架构添加列            Data

MySQL DML操作--------实现pivot行转列功能最佳实战

1. 背景 * 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换. 2. 表与数据 mysql> select * from t_temp; +---------+-----------+------------+ | year    | season    | orderCount | +---------+-----------+------------+ | 2010年  | 一季度    |        100 | | 2010年  | 二季度 

Bootstrap3基础 栅格系统 列中有行,行中有列

? 内容 参数 ??OS ??Windows 10 x64 ??browser ??Firefox 65.0.2 ??framework?? ??Bootstrap 3.3.7 ??editor ??Visual Studio Code 1.32.1?? ??typesetting ??Markdown ? code <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="U

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

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

数据库 行转列 列转行详解

目录结构如下: 行转列 列转行 [一].行转列 1.1.初始测试数据 表结构:TEST_TB_GRADE create table TEST_TB_GRADE ( ID        NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE    VARCHAR2(20 CHAR), SCORE     FLOAT ) [sql] view plaincopy create table TEST_TB_GRADE ( ID        N

SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

来自于 https://www.cnblogs.com/OpenCoder/p/6668882.html 我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlServer2005中我们有了PIVOT/UNPIVOT函数可以快速实现行转列和列转行的操作. PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(<聚合函数>([聚合列值]) FOR

oracle 行转列、列转行

最近做数据处理,经常遇到需要行转列.列转行的场景,记录个非常简单实用的oracle  列转行.行转的列方法 1.行转列,基础数据如下 做行转列处理 处理SQL select user_name,max(date_201501) as date_201501,max(date_201502),max(date_201503),max(date_201504) from (select t.user_name,case when t.acct_date = '201501' then t.flow

SQL 行转列和列转行

行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和总结过.为了加深认识,再总结一次. 行列互转,可以分为静态互转,即事先就知道要处理多少行(列);动态互转,事先不知道处理多少行(列). --创建测试环境 USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orde