sql - 多列上的 CASE 表达式
问题描述
我有一个包含下面提到的列和值的表
StudentId | Geography | History | Maths
_______________________________________________
1 | NULL | 25 | NULL
2 | 20 | 23 | NULL
3 | 20 | 22 | 21
我需要如下输出:
StudentId | Subject
___________________________
1 | History
2 | Geography
2 | History
3 | Geography
3 | History
3 | Maths
无论主题列(地理、历史和数学)中的值是非空的,我都需要接收列名称的“主题”值。
我有一个想法,将它用于一列CASE
,但不知道如何为多列执行此操作。
这是我尝试过的:
SELECT StudentId, CASE WHEN IsNUll(Geography, '#NULL#') <> '#NULL#' THEN 'Geography'
CASE WHEN IsNUll(History, '#NULL#') <> '#NULL#' THEN 'History'
CASE WHEN IsNUll(Maths, '#NULL#') <> '#NULL#' THEN 'Maths' END Subject
FROM MyTable
解决方案
您需要标准化您的数据。您可以使用运算符执行此VALUES
操作:
--Create sample data
WITH YourTable AS(
SELECT V.StudentID,
V.[Geography],
V.History,
V.Maths
FROM (VALUES(1,NULL,25,NULL),
(2,20,23,NULL),
(3,20,22,21))V(StudentID,[Geography], History, Maths))
--Solution
SELECT YT.StudentID,
V.[Subject]
FROM YourTable YT
CROSS APPLY (VALUES('Geography',YT.[Geography]),
('History',YT.History),
('Maths',YT.Maths))V([Subject],SubjectMark)
WHERE V.SubjectMark IS NOT NULL
ORDER BY YT.StudentID;
推荐阅读
- mysql - Python MySQLdb 未使用命名占位符执行
- django - 模板标签中的动态字典名称
- c++ - 可以从非父线程调用 std::thread::join() 吗?
- javascript - 如何使用谷歌折线图两个不同长度的数组
- ruby - 如果评估在 Ruby 中返回 nil,我如何引发异常?
- php - 我无法使用 \Template::instance()->render 打开文件。我收到以下错误
- html - 在视口中适合大尺寸图像而不滑动
- python - Azure 错误:重试策略不允许重试,哪里出错了?
- node.js - 护照-jwt sequelize 401 总是
- c - 如何使用 C 语言的 openLDAP 库 API 以编程方式修改现有的 Open LDAP 对象类?