使用自连接的方法实现行转列

CREATE TABLE `user_kills` (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `timestr` datetime DEFAULT NULL,
  `kills` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user_kills` VALUES (‘1‘, ‘2‘, ‘2020-01-10 00:00:00‘, ‘10‘);
INSERT INTO `user_kills` VALUES (‘2‘, ‘2‘, ‘2020-02-01 00:00:00‘, ‘2‘);
INSERT INTO `user_kills` VALUES (‘3‘, ‘2‘, ‘2020-02-05 00:00:00‘, ‘12‘);
INSERT INTO `user_kills` VALUES (‘4‘, ‘4‘, ‘2020-01-10 00:00:00‘, ‘3‘);
INSERT INTO `user_kills` VALUES (‘5‘, ‘2‘, ‘2020-02-11 00:00:00‘, ‘5‘);
INSERT INTO `user_kills` VALUES (‘6‘, ‘2‘, ‘2020-01-06 00:00:00‘, ‘1‘);
INSERT INTO `user_kills` VALUES (‘7‘, ‘3‘, ‘2020-01-11 00:00:00‘, ‘20‘);
INSERT INTO `user_kills` VALUES (‘8‘, ‘2‘, ‘2020-02-12 00:00:00‘, ‘10‘);
INSERT INTO `user_kills` VALUES (‘9‘, ‘2‘, ‘2020-02-07 00:00:00‘, ‘17‘);

使用自连接的方法实现行转列:

SELECT * FROM
(
SELECT sum(k.kills) as ‘猪八戒‘
FROM user_kills k
WHERE k.user_id = 2
) a CROSS JOIN(
SELECT sum(k.kills) as ‘孙悟空‘
FROM user_kills k
WHERE k.user_id = 3
) b CROSS JOIN(
SELECT sum(k.kills) as ‘沙悟净‘
FROM user_kills k
WHERE k.user_id = 4
) c

使用CASE方法实现行转列:

SELECT
sum(case when user_id = 2 then k.kills end) as ‘猪八戒‘,
sum(case when user_id = 3 then k.kills end) as ‘孙悟空‘,
sum(case when user_id = 4 then k.kills end) as ‘沙悟净‘
FROM user_kills k  

原文地址:https://www.cnblogs.com/ooo0/p/12251748.html

时间: 2024-10-30 16:56:41

使用自连接的方法实现行转列的相关文章

grep、sed和awk等方法实现行转列

[[email protected]~]# cat file 1 2 3 4 5 6 7 8 9 [[email protected]~]# cat file |xargs -n1 [[email protected]~]# xargs -n 1 <file [[email protected]~]# tr " " "\n" <file [[email protected]~]# sed 's/ /\n/g' file [[email protected

MYSQL开发技巧之行转列和列转行

行转列--两种方法第一种方法:行转列我们通常是使用交叉连接和子查询的方式做到,比如下面的例子,查询每个name的对应id的和mysql> select * from user; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | | 5 | a | | 6 | a | | 7 | c | | 8 | d | +----+------+ 我们用分组查询能得到每个name的id的和,但是是

DevExpress实现根据行,列索引来获取RepositoryItem的方法

/// <summary> /// 根据行,列索引来获取RepositoryItem /// </summary> /// <param name="view">GridView</param> /// <param name="rowIndex">行索引</param> /// <param name="columnIndex">列索引</param>

sql行转列、列转行的方法

如题:有一张表EMP,里面有两个字段:name,chengji  有三条记录,分别表示语文(name) 70分,数学(name) 80分,英语(name) 58分,请用一条sql查询出这三条记录并以条件显示出来,大于等于80表示优秀,大于等于60表示及格,小于60分表示不及格!要求显示格式如上! 首先我们创建表,添加如题数据! CREATE TABLE emp(NAME VARCHAR(20),chengji INT); INSERT INTO emp VALUES('语文',70),('数学'

Excel快速删除空白行与调整行高列宽的方法,学会了很实用

Excel表格作为大家经常使用的办公文档,在使用的过程中我们也会遇到各种问题,比如常见的行高列宽的调整.空白行的删除的等等.今天小编就为大家带来了Excel快速删除空白行与行高列宽的方法,希望可以帮助到大家. 一:调整行高列宽 作为Excel表格最常见的问题之一,我们在办公中常用到的调整行高列宽的方法主要有两种,都非常的简单方便. 方法1: 第一种方法也是最简单的一种方法,把鼠标光标放置在行高或者是列宽线条上时,就会出现一个[黑色双箭头]的标志,点击即可拉动线条调整行高.列宽.(唯一的弊端是行高

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

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

SQL行转列(PIVOT)与列转行(UNPIVOT)简明方法

原文地址:https://www.cnblogs.com/linJie1930906722/p/6036714.html 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比较快速实现行转列,列转行,而且可扩展性强 一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3

SQL行转列 (及EAV模型获取数据)

参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: 1 2 3 4 5 SELECT DISTINCT  a.name, (SELECT score FROM grade b

行转列、列转行

一:行转列 模式:N行转一列  本实验N取31.建表SQL> create table grade(id int,name varchar2(10),subject varchar2(10),grade number(3));2.插入实验数据insert into grade values(1,'Andy','Yuwen',11);insert into grade values(2,'Andy','Math',22);insert into grade values(3,'Andy','Eng