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哦,没关系,我误解了想要的结果