2

私は SQL Server 2008 を使用しており、4 つのテーブルがStudentAbsentees, Students, StudentSectionsあり、Sections

テーブルには、特定の日に欠席する (欠席者のみ) をStudentAbsentees格納しています。studentId

    StudentId     Time     Date        
   -----------   ------   ------
       1         10:00    2012-04-13

のような特定のセクションStudentSectionsに保存していますstudentId

 StudentId    SectionId
   ----------   ------------
      1              1
      2              1
      3              1

Studentsテーブルには学生の詳細を保存しています。同様に、テーブルSectionsにはそのセクションの名前や定員などのセクションの詳細があります。

これらのテーブルを結合し、学生が特定の日に出席/欠席しているかどうかを表示する必要があります...結果は次のようになります

StudentId    Status
---------    ------
    1         Absent
    2         Present
    3         Present

これらのテーブルから不在者リストを取得できます。出席者か不在者かを表示する方法がわかりません....ここで誰か助けてもらえますか

4

3 に答える 3

3
select * from (
   select s.id, 
          case 
              when sa.date = '2012-01-01'
              then 'absent'
              else 'present' 
          end as status,
          ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY CASE WHEN sa.date = '2012-01-01' THEN 1 ELSE 2 END) AS RowNumber
   from students s
   left outer join studentabsentees sa on s.id = sa.studentid
)
as a where a.RowNumber = 1
于 2012-04-13T14:44:38.127 に答える
1

結合は必要ありません。集合演算子を使用するだけです。

SELECT StudentID, 'Absent' 
FROM StudentsAbsentees
WHERE [date] = ...
UNION 
(
SELECT StudentID, 'Present'
FROM Students
EXCEPT
SELECT StudentID, 'Present' 
FROM StudentsAbsentees
WHERE [date] = ...
)

「Present」と「Absent」を定数として選択するだけで表示できます。欠席している生徒全員のリストを簡単に取得できます。次に、これを現在のすべての学生と結合します。現在の学生は、完全な学生リストを取得し、行方不明の学生に対してexcept演算子を使用して検索されます。ただし、この部分を除いて、欠席している生徒を出席者として選択して、作成した名前の横に出席しているすべての生徒のリストから適切に差し引くようにしてください。

于 2012-04-13T14:46:52.713 に答える
1

特定の日のすべての学生のステータスを表示するクエリは次のようになります。

select s.id, s.name, a.status
from student s
left join studentabsentees a on s.id = a.studentid
where a.date = ?

当然、日付を指定する必要があります。

注: あなたの質問では、タイトルに「内部結合」が使用されています。すべての学生に表示されるため、左の方が適していると思います。しかし、不在テーブルにレコードがあるものだけが本当に必要な場合は、クエリの「左」という単語を「内部」に変更するだけです。

注 2: 私のクエリは、ステータス フィールドを前提としています。お持ちでない場合は、juergen d's answer をご覧ください。

于 2012-04-13T14:43:07.940 に答える