2011-06-15 78 views
1

我的表看起來就像下面混亂在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 =已完成和日期開始日期和結束日期。當課程開始時,用戶輸入學號,課程ID,日期和狀態,但當課程完成時,用戶輸入課程ID,日期和狀態。用戶不輸入SchoolID。從表中我們可以瞭解到SCH1CRS1和SCH1CRS2屬於SCH1。我需要知道的是,在特定的學校,在特定的日期,有多少課程開始但尚未完成。

您可以在SCH1中看到,在2011-01-15兩個課程已經開始,但只有一個完成。課程何時完成並不重要。我需要知道的是完成與否。在SCH2中,兩門課程在不同的日期開課,但都完成了。

結果表應該是這樣的

Input Date: 2011-01-15 

School    Not completed 

SCH1      1 

SCH2      0 

Input Date: 2011-01-22 

School   Not Completed 

SCH2      0 

我覺得這是一個混亂的表和數據庫設計規則沒有跟上。但這就是我所擁有的。沒有選擇。

感謝

回答

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 
0

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 - 起始日期 - CompletedDate - courseStatus

course1 - 2010-01-12 - 2010-02-25 - 完成

course2 - 2011-01-21 - 空 - 不完全

course3 - 2010-10-15 - 空 - 不完全

0

如何:

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;