在SQL中,用另一个值替换空值

在SQL中,用另一个值替换空值,sql,sql-server,sql-server-2008,sql-server-2008-r2,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,Sql Server 2012,这是我的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.ObtainedPractica

这是我的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'
这将产生如图片所示的结果:

但我想要这样的结果,因为那两个学生在那次考试中缺席了

类似地,如果三名学生中的任何一名确实存在另一项考试,并且其他学生缺席,则应重复相同的过程

使用IsNULL()函数参见下面的示例

Declare @variable varchar(MAX)
set @variable = NULL
select IsNULL(@variable,0) as A

让我们来看看以下示例数据(它与您的示例数据类似,只是插入到一个表中):

因此,我假设我们这里只有一个考试的详细信息,问题是如何使用现有值替换
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
子句,因为您不打算在初始查询中添加
groupby
子句。此外,如果您有更多检查的详细信息,您可以使用
分区依据
子句(如果您有一些列来区分每个检查的
NULL
行)。

您能解释一下您试图实现的输出背后的逻辑吗?这些“默认”值从何而来?在这个特定的结果集中,学生被注册参加考试。在上面的结果中,一号学生参加了第28次考试,但其余两人没有参加,但考试是强制性的。因此,ExamID、ExamName、SubjectID字段也应该填充给那些没有参加的学生。值为A的两列中的其余部分表示不存在。图像出现问题。我想我不能这么做。因为在本例中,isnull用一些已知的静态值替换null字段,但在我的情况下,我不知道用什么值替换该null字段。但我知道的是;包含值的字段,该值应传递给nullfields@user42392,使用
ISNULL(ColumnContainedNULL,ColumnWhichReplaceNULLValue
)好的,我将在查询中尝试此方法。是的,我还必须显示更多的考试结果。@user42392好的,您需要在示例数据中添加一列或多列,以区分考试。另一种解决方案是按某些列对结果进行排序。您能否编辑您的问题并添加此类数据/输出?
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;