如何解决在SQL Server中构建SQL查询时出现混乱
| 我的桌子如下图所示School Course Date Status
SCH1 SCH1CRS1 2011-01-15 S
SCH1CRS1 2011-01-17 C
SCH1 SCH1CRS2 2011-01-15 S
SCH2 SCH2CRS1 2011-01-15 S
SCH2CRS1 2011-01-21 C
SCH2 SCH2CRS2 2011-01-22 S
SCH2CRS2 2011-01-25 C
状态S =开始,C =完成,日期是开始日期和完成日期。当课程开始时,用户输入schoolID,课程ID,日期和状态,但是当课程完成时,用户输入课程ID,日期和状态。用户不输入SchoolID。从表中我们可以了解到SCH1CRS1和SCH1CRS2属于SCH1。我需要知道的是,在一所特定的学校中,在特定的日期,有多少门课程开始但尚未完成。
您可以在SCH1中看到,在2011年1月15日开始了两门课程,但只有一门课程完成了。课程何时完成无关紧要。我所需要知道的全部是完成还是没有完成。在SCH2中,两个课程在不同的日期开始,但是都已完成。
结果表应该是这样的
Input Date: 2011-01-15
School Not completed
SCH1 1
SCH2 0
Input Date: 2011-01-22
School Not Completed
SCH2 0
我认为这是一个凌乱的表,没有遵循数据库设计规则。但这就是我所拥有的。没有选择。
谢谢
解决方法
您必须找到与已开始的课程相关的已完成的课程,如果没有已完成的课程,请计数1。
SELECT startedCourse.School AS School,SUM(CASE WHEN completedCourse IS NULL THEN 1 ELSE 0 END) AS NotCompleted
FROM MyTable startedCourse
LEFT OUTER JOIN MyTable completedCourse
ON startedCourse.Status = \'S\'
AND completedCourse.Status = \'C\'
AND startedCourse.Course = completedCourse.Course
WHERE startedCourse.Date = ?
GROUP BY startedCourse.School
, 从我的头顶:
select c_started.courseID,c_started.courseDate as StartDate,c_completed.courseDate as CompletedDate,case
when c_completed.courseDate IS NULL then \'incomplete\'
Else \'completed\'
end as courseStatus
from tbCourses as c_started
left join tbCourses as c_completed on c_started.courseID = c_completed.courseID
and c_started.courseDate < c_completed.courseDate
where c_started.Status = \'S\'
将为您提供以下内容:
courseID-StartDate-CompletedDate-courseStatus
路线1-2010-01-12-2010-02-25-完成
course2-2011-01-21-NULL-不完整
course3-2010-10-15-NULL-不完整
, 这个怎么样:
declare @InputDate datetime = \'20110115\';
with cCourseList as (
select t1.School,t1.Course,DateStarted = t1.Date,t2.DateCompleted
from tbl t1
outer apply
(select top(1) DateCompleted = t2.Date
from tbl t2
where t2.Course = t1.Course
and t2.Status = \'C\'
order by t2.Date) t2
where t1.Status = \'S\'
)
select cl.School,[Not Completed] = sum(case when cl.DateCompleted is null then 1 else 0 end)
from cCourseList cl
where cl.DateStarted <= @InputDate
group by cl.School;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。