优化MySQL中CASE语句的使用

u5rb5r59  于 2022-11-28  发布在  Mysql
关注(0)|答案(2)|浏览(124)

大家好,
我有一个如上面截图所示的表。我使用CASE语句编写了一个查询,以便它返回我需要的额外列。下面是我编写的查询:

SELECT 
    *,
    CASE WHEN (SUM(CASE WHEN class = 'class 1' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0  END AS 'Class 1',
    CASE WHEN (SUM(CASE WHEN class = 'class 2' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0  END AS 'Class 2',
    CASE WHEN (SUM(CASE WHEN class = 'class 3' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0  END AS 'Class 3',
    CASE WHEN (SUM(CASE WHEN class = 'class 4' THEN 1 END) OVER(PARTITION BY student_id)) >= 1 THEN 1 ELSE 0  END AS 'Class 4'
FROM qa;

这是我得到的结果表:

在这个查询中,我想实现的是,如果学生参加了课程,它将在class列下显示属于该学生的所有行的1
例如,成绩为student_id2的学生参加了class 1,因此在Class 1列下,student_id2的两行都将显示1
我已经在我的查询中实现了我想要的,但是现在我不想使用1,而是希望它是类的enrollment_date。下面是我想要的最终输出:

我可以知道我应该如何修改我的查询以获得上面屏幕截图中的最终输出吗?

第二个问题:

正如您在上面的查询中所看到的,每个类都分别有一个CASE语句,以便为该类创建列。因此每当存在不同的新类时,我需要再次添加额外的CASE语句。是否有任何方法可以优化我的查询,这样就不需要为4个不同的类使用4个CASE语句,但仍然可以为不同的类创建列(当有一个新类时,也会为该类创建新列)?

示例数据

create table qa(
    student_id INT,
    class varchar(20),
    class_end_date date,
    enrollment_date date
);

insert into qa (student_id, class, class_end_date, enrollment_date) 
values 
(1, 'class 1', '2022-03-03', '2022-02-14'),
(1, 'class 3', '2022-06-13', '2022-04-12'),
(1, 'class 4', '2022-07-03', '2022-06-19'),
(2, 'class 1', '2023-03-03', '2022-07-14'),
(2, 'class 2', '2022-08-03', '2022-07-17'),
(4, 'class 4', '2023-03-03', '2022-012-14'),
(4, 'class 2', '2022-04-03', '2022-03-21')
;
sqserrrh

sqserrrh1#

下面是一个同时透视了class_end_date和enrollment_date的示例-

SELECT 
    student_id,
    GROUP_CONCAT(IF(class = 'class 1', enrollment_date, null)) 'Class 1 Enrolled',
    GROUP_CONCAT(IF(class = 'class 1', class_end_date, null)) 'Class 1 End',
    GROUP_CONCAT(IF(class = 'class 2', enrollment_date, null)) 'Class 2 Enrolled',
    GROUP_CONCAT(IF(class = 'class 2', class_end_date, null)) 'Class 2 End',
    GROUP_CONCAT(IF(class = 'class 3', enrollment_date, null)) 'Class 3 Enrolled',
    GROUP_CONCAT(IF(class = 'class 3', class_end_date, null)) 'Class 3 End',
    GROUP_CONCAT(IF(class = 'class 4', enrollment_date, null)) 'Class 4 Enrolled',
    GROUP_CONCAT(IF(class = 'class 4', class_end_date, null)) 'Class 4 End'
FROM qa
GROUP BY student_id;
enyaitl3

enyaitl32#

请参阅Pivot,以取得根据数据表定义和数据产生并[选择性]执行查询的存储程序。

相关问题