Sql 返回多行的结果

Sql 返回多行的结果,sql,sql-server-2008,Sql,Sql Server 2008,我创建了一个存储过程,在每天结束时运行,它将返回课堂上每个学生的出勤率,结果集将显示学生以前的出勤率与新的出勤率的比较。但是由于某些原因,结果被存储在多行而不是一行中。下面的图表将使您更好地了解问题 这两个表格: 学生表 百分比表 我编写的将结果放入组合表的代码: select StudentTb.StudentId, StudentTb.Forename, StudentTb.Surname, CONVERT(VARCHAR(10),DATEADD(DAY, DATEDIFF(DAY,

我创建了一个存储过程,在每天结束时运行,它将返回课堂上每个学生的出勤率,结果集将显示学生以前的出勤率与新的出勤率的比较。但是由于某些原因,结果被存储在多行而不是一行中。下面的图表将使您更好地了解问题

这两个表格:

学生表

百分比表

我编写的将结果放入组合表的代码:

select 
StudentTb.StudentId,
StudentTb.Forename,
StudentTb.Surname,
CONVERT(VARCHAR(10),DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE())-1, 0),103) as [Previous Reading Date]
case studentTb.Date 
when DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE())-1, 0) then PercentageTb.Percentage
End
'Previous Percentage'
CONVERT(VARCHAR,DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0),103) as [Present Reading Date]
case studentTb.Date 
when DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE())-1, 0) then PercentageTb.Percentage
End
'Current Percentage'
from studentTb inner join
                  PercentageTb on studentTb.StudentID = PercentageTb.StudentID
这是这个查询的结果集

但是这不是我想要的结果,下面显示了所需的结果集


我原以为
CASE
语句会帮我做到这一点,但显然我错了,有人能告诉我接下来该怎么做吗?

一种方法是使用
max()
聚合函数将结果展平,如下所示:

select 
    s.StudentID,
    s.Forename,
    s.Surname,
    max(case when p.date = CONVERT(VARCHAR,DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()), 0),103) then p.date end) prev_date,
    max(case when p.date = CONVERT(VARCHAR,DATEADD(DAY, DATEDIFF(DAY, 1, GETDATE()), 0),103) then p.percentage end) prev_perc,
    max(case when p.date = CONVERT(VARCHAR,DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0),103) then p.date end) curr_date,
    max(case when p.date = CONVERT(VARCHAR,DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0),103) then p.percentage end) curr_perc
from studentTb s
inner join percentageTb p on s.StudentID = p.StudentID
group by s.StudentID, s.Forename, s.Surname


另一个选项是两次加入
percentageTb
表(一次用于当前日期,一次用于前一天),请参阅。

为什么不使用子选择进行选择?假设一个学生每天只能有一个结果

DECLARE @CurrentDate DATE
DECLARE @PreviousDate DATE
SET @CurrentDate = 
SET @PreviousDate = 


SELECT
    StudentTb.StudentId AS [ID],
    StudentTb.Forename AS [Forename],
    StudentTb.Surname AS [Surname],
    (SELECT Percentage from PercentageTb where StudentID = S.studentID and Date = @PreviousDate) AS [PreviousPercentage]
    (SELECT Percentage from PercentageTb where StudentID = S.studentID and Date = @CurrentDate) AS [CurrentPercentage]
from studentTb  AS S

错误地插入了两次所需的结果集!是我还是有很多语法错误…?你的连接就是问题所在。你需要更多的逻辑来打破它。联接为每个学生匹配2行(即2*2=4),这是正确的,对吗?每一天2=2*2=4哦,没关系,我误解了想要的结果