特意下载了mysql。。。。。。。大兄弟
以下实现的是静态方式,不支持你多出的 “英语”
-- 建表
CREATE TABLE student_info
(id
int(10) NOT NULL AUTO_INCREMENT,name
varchar(8) DEFAULT NULL, -- 学生course
varchar(32) DEFAULT NULL,-- 课程score
int(10) DEFAULT NULL, -- 分数
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 ;
-- YW :语文,SX :数学
insert into student_info (name,course,score) values ('zhangsan','YW',80);
insert into student_info (name,course,score) values ('zhangsan','SX',60);
insert into student_info (name,course,score) values ('lisi','YW',70);
-- YW-语文,SX-数学 ,ZF-总分 ,MC-名次
select t.name, t.YW, t.SX, (YW + SX) AS ZF ,@rownum:=@rownum+1 AS MC from (
select std.name,
MAX(CASE c.course WHEN 'YW' THEN ifnull(s.score,0) ELSE 0 END ) YW,
MAX(CASE c.course WHEN 'SX' THEN ifnull(s.score,0) ELSE 0 END ) SX
from ( select distinct name from student_info ) std
Left Join student_info s on std.name = s.name
Left Join (select distinct course from student_info) c on c.course = s.course
group by std.name ) t ,(SELECT @rownum:=0) r ORDER BY ZF DESC;
给点分吧。。。。。
要实现你的需求,需要写动态的。。。。
SELECT * FROM 表名称
应该是这样吧,表名总是固定的吧。
这个有点像矩阵的转置,但是通过group by 之后的列数量时确定的,应该不能像你这样动态改变
有一个折中的方法,就是将语文、数学、英语等合并成一列,用group_concat 这样的方式
sql 行转列, 列转行的 概念、用法,了解一下
SELECT * FROM [StudentScores] /*数据源*/
AS P
PIVOT
(
SUM(Score/*行转列后 列的值*/) FOR
p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
) AS T
下面这段代码应该可以解决你的问题, 排行,各科成绩都展示出来了,如果需要,可以动态添加:
SELECT
@rownum := @rownum + 1 AS rownum,
IF
( @total = total, @rank, @rank := @rownum ) AS rank,
A.*
FROM
( SELECT student_name,
SUM(IF(project='语文',score,0)) AS 语文,
SUM( score ) AS total
FROM student_score
GROUP BY student_name
ORDER BY total desc
) AS A,
( SELECT @rank := 0, @rownum := 0, @total := NULL ) B
先查询所有涨三的数据,然后行转列显示。
--动态行转列 如果不懂可以详细联系QQ 434317590
--主要思想1、先查询出动态列并且拼接出列名 2、通过函数PIVOT实现行转列,拼接出要执行的语句 3、执行拼接后的sql语句
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'u_ware_saleprice'
SET @groupColumn = 'wareid'
SET @row2column = 'groupid'
SET @row2columnValue = 'saleprice'
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
SELECT * FROM (
SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p
PIVOT (max(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (@sql_str)
不理解你这个表为什么这么设计,不过我还是提供一个简单的答案给你参考,我在想如果是查询成绩的,那么无论分数有多少,课程的数量应该每个人
都是一样的,所以给李四再插入一条记录(name:李四 数学:0),最好把英语等将用到的科目加上,如果没成绩, 统统为0。
这样查询会比较方便些
都几百G
SELECT
p1. NAME,
p1.score AS 语文,
p2.score AS 数学,
p1.score+p2.score as 总分,
@rowno:=@rowno + 1 as 名次
FROM
Person p1
INNER JOIN Person p2 ON p1.name
= p2.name
AND p1.course = '语文'
AND p2.course = '数学',(SELECT @rowno:=0) b
/*
Navicat Premium Data Transfer
Source Server : mycrm
Source Server Type : MySQL
Source Server Version : 50722
Source Host : localhost
Source Database : hib_source
Target Server Type : MySQL
Target Server Version : 50722
File Encoding : utf-8
Date: 08/21/2018 17:12:34 PM
*/
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for `Person`
-- ----------------------------
DROP TABLE IF EXISTS `Person`;
CREATE TABLE `Person` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`course` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '课程',
`score` double(6,0) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of `Person`
-- ----------------------------
BEGIN;
INSERT INTO `Person` VALUES ('1', '张三', '语文', '80'), ('2', '张三', '数学', '60'), ('3', '李四', '语文', '70'), ('4', '李四', '数学', '0');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
1.如果我们要添加某科的成绩,就使用INSERT语句向表中插入一条记录:
INSERT tb_Studentscore
( Name
,Major
,Score)
VALUES
('李四'
,'英语'
,80);
INSERT tb_Studentscore
( Name
,Major
,Score)
VALUES
('张三'
,'英语'
,90);
插入完成后,在进行查询
SELECT *
SUM( score ) AS total
FROM Studentscore
GROUP BY student_name
ORDER BY total desc