下面是我的SQL查询
SELECT p.StudentID, ai.RollNo, p.FirstName, p.MiddleName, p.LastName,
om.ExamID, et.ExamName, om.SubjectID,
ISNULL(CONVERT(varchar(20),om.ObtainedMarksTheory), 'A') as 'ObtainedMarksTheory',
ISNULL(CONVERT(varchar(20),om.ObtainedPracticalMarks),'A') as 'ObtainedPracticalMarks'
FROM Students.PersonalInfo p
INNER JOIN Students.AcademicCourse ac on p.StudentID = ac.StudentID
INNER JOIN Students.AcademicInfo ai on p.StudentID=ai.StudentID
LEFT OUTER JOIN Exam.ObtainedMarkEntry om on p.StudentID = om.StudentID
LEFT JOIN Exam.ExamType et on om.ExamID = et.ExamID
WHERE ai.BatchID = '103' AND ai.SemesterID = '21' and ac.Section = '8'
这将产生如图所示的结果:
但是我想要这样的结果,因为那两个学生没有参加考试
类似地,如果三个学生中的任何一个存在另一个考试,并且其他学生缺席,则应重复相同的过程
发布于 2015-07-23 19:27:27
使用IsNULL()函数参见下面的示例
Declare @variable varchar(MAX)
set @variable = NULL
select IsNULL(@variable,0) as A
发布于 2015-07-23 19:34:40
让我们有以下示例数据(它类似于您的示例数据,只是插入到一个表中):
DECLARE @DataSource TABLE
(
[StudentID] TINYINT
,[RowNo] TINYINT
,[FirstName] VARCHAR(12)
,[MiddleName] VARCHAR(12)
,[LastName] VARCHAR(12)
,[ExamID] TINYINT
,[ExamName] VARCHAR(18)
,[SubjectID] TINYINT
,[ObtainedMarksTheory] VARCHAR(12)
,[ObtainedPracticalMarks] VARCHAR(12)
);
INSERT INTO @DataSource ([StudentID], [RowNo], [FirstName], [MiddleName], [LastName], [ExamID], [ExamName], [SubjectID], [ObtainedMarksTheory], [ObtainedPracticalMarks])
VALUES (101, 1, 'FN_A', 'MN_A', 'LN_A', NULL, NULL, NULL, 'A', 'A')
,(102, 2, 'FN_B', 'MN_B', 'LN_B', 28, 'First Tem2072', 97, '74.00', '56.00')
,(103, 3, 'FN_C', 'MN_C', 'LN_C', NULL, NULL, NULL, 'A', 'A');
SELECT *
FROM @DataSource;
因此,我假设我们这里只有一项检查的详细信息,问题是如何使用现有值替换ExamID
、ExamName
和SubjectID
列的NULL
值。
解决方案是使用带有OVER
子句的MAX
函数:
SELECT [StudentID]
,[RowNo]
,[FirstName]
,[MiddleName]
,[LastName]
,MAX([ExamID]) OVER() AS [ExamID]
,MAX([ExamName]) OVER() AS [ExamName]
,MAX([SubjectID]) OVER() AS [SubjectID]
,[ObtainedMarksTheory]
,[ObtainedPracticalMarks]
FROM @DataSource;
请注意,由于不打算在初始查询中添加OVER
子句,因此最好使用GROUP BY
子句。此外,如果您有更多检查的详细信息,可以使用PARTITION BY
子句(如果您有一些列来区分每个检查的NULL
行)。
https://stackoverflow.com/questions/31585603
复制相似问题