大家好,
我有一个如上面截图所示的表。我使用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_id
2
的学生参加了class 1
,因此在Class 1
列下,student_id
2
的两行都将显示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')
;
2条答案
按热度按时间sqserrrh1#
下面是一个同时透视了class_end_date和enrollment_date的示例-
enyaitl32#
请参阅Pivot,以取得根据数据表定义和数据产生并[选择性]执行查询的存储程序。