weixin_40119478
Zaylour
2018-08-20 09:41
采纳率: 69.2%
浏览 929

这个sql语句应该怎么写?

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • u013927589
    还来得及 2018-08-20 15:15
    已采纳

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

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

    点赞 评论
  • phenix2009
    白色一大坨 2018-08-20 09:46

    SELECT * FROM 表名称
    应该是这样吧,表名总是固定的吧。

    点赞 评论
  • weixin_42920757
    小小菜鸟2020 2018-08-20 09:49

    这个有点像矩阵的转置,但是通过group by 之后的列数量时确定的,应该不能像你这样动态改变
    有一个折中的方法,就是将语文、数学、英语等合并成一列,用group_concat 这样的方式

    点赞 评论
  • qq_27848369
    hot2dog 2018-08-20 09:51

    sql 行转列, 列转行的 概念、用法,了解一下

    点赞 评论
  • flyvsqiqi
    flyvsqiqi 2018-08-20 09:54

    SELECT * FROM [StudentScores] /*数据源*/
    AS P
    PIVOT
    (
    SUM(Score/*行转列后 列的值*/) FOR
    p.Subject/*需要行转列的列*/ IN ([语文],[数学],[英语],[生物]/*列的值*/)
    ) AS T

    点赞 评论
  • weixin_41386123
    coder_xiaozhao 2018-08-21 00:57

    下面这段代码应该可以解决你的问题, 排行,各科成绩都展示出来了,如果需要,可以动态添加:
    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_41326393
    weixin_41326393 2018-08-21 01:22

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

    点赞 评论
  • qq_16962131
    qq_16962131 2018-08-21 01:40

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

    点赞 评论
  • wyAdfAo
    mylittleluck 2018-08-21 08:32

    不理解你这个表为什么这么设计,不过我还是提供一个简单的答案给你参考,我在想如果是查询成绩的,那么无论分数有多少,课程的数量应该每个人
    都是一样的,所以给李四再插入一条记录(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
    mylittleluck 2018-08-21 09:09
    /*
     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;
    
    
    
    点赞 评论
  • lgy3160707023
    lgy3160707023 2018-10-04 00:43

    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

    点赞 评论

相关推荐