`

SQL CASE WHEN实例

阅读更多
   有三张表:

      学生表student(stu_id, name)

      成绩表scores(stu_id, subject, score)

      补考成绩表(stu_id, subject, score)

   其中:
        stu_id:ID
        name:姓名
        subject:课程
        score:成绩

   输出:
      姓名、课程和成绩 (没有补考,以成绩表为准,有补考,以成绩表和补考成绩表的较大者为准)


1. 准备表和数据

这里以MySQL数据库为例
-- 创建学生表
CREATE TABLE `student` (
	`stu_id` TINYINT NOT NULL,
	`name` varchar(8) NOT NULL,
	PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- 创建成绩表
CREATE TABLE `scores` (
	`stu_id` TINYINT NOT NULL,
	`subject` varchar(16) NOT NULL,
	`score` TINYINT NOT NULL DEFAULT 0,
	PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- 创建补考成绩表
CREATE TABLE `scores_sup` (
	`stu_id` TINYINT NOT NULL,
	`subject` varchar(16) NOT NULL,
	`score` TINYINT NOT NULL DEFAULT 0,
	PRIMARY KEY (`stu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- 插入测试数据
INSERT INTO `student`(
	stu_id,
	name
)
VALUES
('1', '张三'),
('2', '李四'),
('3', '王五');

INSERT INTO `scores`(
	stu_id,
	subject,
	score
)
VALUES
('1', '语文', 60),
('2', '数学', 65),
('1', '英语', 70),
('1', '数学', 56),
('2', '语文', 49),
('2', '英语', 58),
('3', '语文', 57),
('3', '数学', 54),
('3', '英语', 79);

INSERT INTO `scores_sup`(
	stu_id,
	subject,
	score
)
VALUES
('1', '数学', 78),
('2', '语文', 80),
('2', '英语', 68),
('3', '语文', 53),
('3', '数学', 59);


2. 查询语句:

第一种思路:

   a. 成绩表和补考成绩表左联接,利用CASE WHEN来决定输出哪个成绩。

   b. 然后和学生表左联接,获取对应的姓名

SELECT
    s.name,
    a.subject,
    CASE
        WHEN a.score >= 60 -- 成绩通过,以成绩表为准
        THEN a.score
        WHEN a.score < b.score -- 成绩没有补考的成绩高,以补考成绩为准
        THEN b.score
        ELSE a.score -- 成绩比补考的成绩高,以成绩表为准
    END AS score
FROM
    scores a
LEFT JOIN
    scores_sup b -- 成绩表左联接补考表(补考表中可能没有成绩表中的记录)
ON
    a.stu_id = b.stu_id
AND a.subject = b.subject
LEFT JOIN
    student s -- 左联接学生表
ON
    a.stu_id = s.stu_id;


利用MySQL的GREATEST(value1,value2,...),注意,任意一个参数为NULL,结果即为NULL。CASE块可以改写成
    CASE
        WHEN b.score IS NULL
        THEN a.score
        ELSE GREATEST(a.score, b.score)
    END AS score



第二种思路:

   a. 成绩表和补考成绩表联合,利用GROUP BY对学生和课程进行分组,利用MAX函数来获取最好的成绩。

   b. 将a的结果作为一个表和学生表左联接,获取对应的姓名
  
SELECT
    t.name,
    s.subject,
    s.score
FROM
    (
        SELECT
            stu_id,
            subject,
            MAX(score) AS score
        FROM
            (
                SELECT
                    *
                FROM
                    scores
                UNION
                SELECT
                    *
                FROM
                    scores_sup) u -- 成绩表和补考表联合
        GROUP BY
            stu_id,
            subject) s -- 分组
LEFT JOIN
    student t -- 左联接学生表
ON
    s.stu_id = t.stu_id;


3. 输出:
+----------+---------+-------+
| name | subject | score |
+----------+---------+-------+
| 张三     | 数学    |    78 |
| 李四     | 语文    |    80 |
| 李四     | 英语    |    68 |
| 王五     | 语文    |    57 |
| 王五     | 数学    |    59 |
| 张三     | 语文    |    60 |
| 李四     | 数学    |    65 |
| 张三     | 英语    |    70 |
| 王五     | 英语    |    79 |
+----------+---------+-------+
分享到:
评论

相关推荐

    sql数据库 转 Access SQL语句改写之 Case When Then When Then Else End

    ### SQL数据库转Access SQL语句改写:Case When Then When Then Else End #### 知识点一:SQL CASE WHEN THEN 结构与Access IIF及SWITCH函数对比 在进行SQL到Access SQL的转换过程中,一个重要的知识点是了解如何...

    mysql存储过程之case语句用法实例详解

    在这个结构中,`case_expression`是你要检查的表达式,`when_expression`是你想要匹配的值,`commands`是匹配成功后要执行的SQL语句。如果`case_expression`的值与`when_expression`之一匹配,那么对应的`commands`...

    SQLsevrer CASE用法

    ### SQL Server 中 CASE 表达式的深入解析与应用实例 #### 概述 在 SQL Server 数据库管理系统中,`CASE` 表达式是一种非常强大的工具,用于在查询语句中进行条件判断和数据处理。它允许用户根据指定的条件返回...

    mysql case when group by 实例详解

    MySQL中的`CASE WHEN`语句是一种条件判断表达式,它在SQL查询中起到了类似编程语言中`switch-case`或`if-else`的作用。这个功能强大的工具允许你在单个查询中根据不同的条件返回不同的结果值,非常适合数据分析和...

    一套完整的SQL开发实例

    ### SQL开发实例详解 在本篇文章中,我们将深入探讨一个SQL开发实例,涵盖数据库的创建、表的构建、数据插入以及复杂查询的执行。通过这一系列步骤,我们不仅能够掌握SQL的基本语法,还能理解如何利用SQL进行数据...

    MySQL的CASE WHEN语句的几个使用实例

    在这个实例中,我们将深入理解如何使用CASE WHEN,并通过几个具体的例子来演示其用法。 首先,我们来看一个简单的使用CASE WHEN进行字符串替换的例子。在这个示例中,我们有一个名为sales的表,其中包含了category...

    MySQL 中CASE-WHEN 的应用.pdf

    本文将深入探讨CASE-WHEN的用法,并结合一个问卷调查系统的实例来展示其在MySQL中的实际应用。 1. 业务需求分析 在开发问卷调查系统时,我们需要记录和统计参与者的回答,以生成分析报告。这涉及到一个问题表...

    sql判断语句.txt

    通过对SQL中的CASE语句进行详细的介绍和实例分析,我们可以看到CASE语句的强大功能和灵活性。正确地使用CASE语句不仅可以简化复杂的条件判断逻辑,还能提高查询的可读性和可维护性。无论是初学者还是有经验的开发...

    oracle SQL优化实例

    ### Oracle SQL优化实例详解 #### 一、减少I/O操作 在Oracle数据库中,I/O操作通常是查询执行过程中最耗时的部分之一。因此,减少I/O操作可以显著提高查询性能。 **示例代码:** ```sql SELECT COUNT(CASE WHEN ...

    sql2000交叉表实例

    SELECT @sql = @sql + 'SUM(CASE Subject WHEN ''' + Subject + ''' THEN Source ELSE 0 END) AS ''' + Subject + ''',' FROM (SELECT DISTINCT Subject FROM SalesData) AS a -- 去掉最后一个逗号 SET @sql = ...

    SQL Serve 自动编号实例

    ### SQL Server 自动编号实例详解 #### 背景介绍 在数据库管理中,自动编号是一种常见的需求,尤其是在处理大量数据记录时。SQL Server 提供了多种方式来实现这一功能,比如通过序列(sequence)、标识列...

    MySQL case when使用方法实例解析

    MySQL中的`CASE WHEN`语句是一种条件判断表达式,它允许在SQL查询中根据不同的条件返回不同的值。这个功能在数据分析、报表生成以及数据处理中非常有用,因为它提供了灵活的逻辑分支来处理数据。下面我们将深入探讨`...

    sql 行转列 静态、动态 实例

    本实例将详细讲解如何在SQL中实现行转列,包括静态转换和动态转换两种方法。 1. 静态行转列 在静态行转列中,我们预先知道要转换的行数。以下是一个示例: 首先,我们创建一个名为`chun_test`的测试表,并插入数据...

    SQL按月分组.txt

    根据提供的文件信息,本文将详细解释如何在SQL中实现按月份进行数据分组,并通过一个具体实例来加深理解。此方法对于需要分析时间序列数据、尤其是销售数据分析的应用场景非常有用。 ### SQL按月分组的核心概念 ##...

    SQLserver存储过程语法及实例

    接下来,将详细介绍SQL Server存储过程的关键语法和实例。 1. 创建存储过程的基本语法 存储过程通常使用CREATE PROCEDURE语句来创建。这里是一个简单的创建存储过程的示例: ```sql CREATE PROCEDURE sp_name AS ...

    Sql,oracle数据表行转列问题

    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']' from (select distinct 课程 from tb) as a set @sql = @sql + ' from tb group by 姓名' exec(@sql) ``` 这...

    SQL高级用法

    SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS 胜, SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS 负 FROM ( SELECT * FROM my_table ) AS t GROUP BY time; ``` 在这个例子中,我们首先创建了一...

    t-sql整理实例小书

    WHEN (SELECT MIN(id) FROM CTE WHERE = .) THEN ELSE '' END, С, ۸, FROM CTE ``` 这里通过`CASE`语句结合子查询来实现条件判断,根据`id`的最小值来决定是否显示某一列的值。 综上所述,这段代码主要展示...

    SQL经典面试题及答案

    这里涉及到了SQL中的`GROUP BY`语句以及`CASE WHEN`表达式。 **解决方案:** 给出的三种方法分别是: 1. **使用CASE WHEN进行计数** ```sql SELECT rq, SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '...

Global site tag (gtag.js) - Google Analytics