2010-12-08 52 views
2

比方說,我有3個表:如何在SQL Server中列出所有需要的月份?

Student (
    student_id, 
    student_type_id, 
    start_date, 
    end_date 
) 

RequiredAssignments (
    student_type_id, 
    monthly_assignments_required 
) 

Assignment (
    student_id, 
    datecompleted 
) 

基本上,在RequiredAssignments表中,monthly_assignments_required場,指出有多少分配給定類型的每個學生必須在每個月把一個整數。

我想構建一個查詢,列出學生,一個月,需要多少分配以及他們爲每個學生轉入的次數,每個學生在給定開始日期和結束日期之間的每個月。

我卡現在在得到與開始和結束日期(含)之間的,每月列出的student_id ...

感謝您的幫助。

+0

是「monthly_assignments_required」每個月的相同?對我來說,你好像在你的RequiredAssignments表中缺少一個「月」或類似的東西......或者你怎麼知道每個學生類型在給定月份中有多少個作業? – 2010-12-08 14:50:07

+0

總是一樣的......類型1的學生每個月都必須交4次作業,類型2將總是每個月交3次,等等等等。 – 2010-12-08 14:52:54

回答

2

您需要創建一個數字表。

CREATE TABLE dbo.Numbers 
(
n INT PRIMARY KEY 
); 


WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), --2 
     E02(N) AS (SELECT 1 FROM E00 a, E00 b), --4 
     E04(N) AS (SELECT 1 FROM E02 a, E02 b), --16 
     E08(N) AS (SELECT 1 FROM E04 a, E04 b), --256 
     E16(N) AS (SELECT 1 FROM E08 a, E08 b) --65,536 
INSERT INTO dbo.Numbers 
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)) 
FROM E16 

一旦你有了這個,你可以這樣做(未經測試)

SELECT s.student_id, 
     DATEADD(MONTH,n-1,start_date) AS MonthStart, 
     COUNT(*) 
FROM Student s 
JOIN dbo.Numbers ON n <= (1 + DATEDIFF(MONTH,s.start_date, s.end_date)) 
LEFT JOIN Assignment a ON a.student_id = s.student_id and a.datecompleted >= DATEADD(MONTH,n-1,start_date) and a.datecompleted < DATEADD(MONTH,n,start_date) 
GROUP BY s.student_id, DATEADD(MONTH,n-1,start_date) 
相關問題