这个sql语句应该怎么写?

图片说明

11个回答

特意下载了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;

给点分吧。。。。。
要实现你的需求,需要写动态的。。。。

u013927589
还来得及 楼主,你要是觉得有点用,请给些C币,下载资料需要的!另外,竟然还有踩?????都已经说了静态的,你有没有拿sql去跑过
接近 2 年之前 回复

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

weixin_41386123
coder_xiaozhao SUM(IF(project='语文',score,0)) AS 语文,
接近 2 年之前 回复

先查询所有涨三的数据,然后行转列显示。

--动态行转列 如果不懂可以详细联系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


wyAdfAo
believe-liar 回复wyAdfAo: 参考表在下面
接近 2 年之前 回复
wyAdfAo
believe-liar 我的意思是服务器随便一台都几百G,别再意一两条记录,后期怎么维护方便就怎么来
接近 2 年之前 回复
/*
 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;


wyAdfAo
believe-liar 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
接近 2 年之前 回复
wyAdfAo
believe-liar 请用这个数据参考一下,我是模拟你的表建的
接近 2 年之前 回复
共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问