2010-12-08 5 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」テーブルに「月」などの情報が欠落しているように思えます。あるいは、各学生タイプがどのくらい多く割り当てられているかをどのように知っていますか? –

+0

これは常に同じです...タイプ1の学生は毎月4つの課題を毎回入れなければなりません。タイプ2は常に毎月3回などになります。 –

+0

これまでのクエリの様子をお見せできますか? – smirkingman

答えて

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) 
+0

ありがとうございます。これは、私が行ってきたルートのようなものです。私はそれが完了したら私が出てくるものを投稿しますが、これは確かに助けになるでしょう! –

関連する問題