首页 > 解决方案 > 多列上的 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

标签: sqlsql-server

解决方案


您需要标准化您的数据。您可以使用运算符执行此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;

DB<>小提琴


推荐阅读