我正在努力学习SQL Joins概念,当我试图获得学生出勤记录时,我正面临着问题。有3个表必须使用。
attendance a - has all student attendance
st_holiday b,
- 学生特定的假期公开名单
hol_list c
- 所有假期列表,包括周末
有两个问题: 1.我需要能给我in_time,out_time和holiday_type的数据。学生也可以在假期(可以是公共假期或周末)上课。
我尝试了下面的查询,它只给我假期参加日期。
select a.student_id, a.in_time, a.out_time, b.holiday_type
from attendance a, st_holiday b, hol_list c
where a.st_id = b.st_id
and b.holiday = c.id
and a.date = c.hol_date
我也尝试过使用left outer join st_holiday on a.st_id = b.st_id and left outer join holiday_type on a.date = c.hol_date
但它给了我所有数据,每个数据holiday_type显示为假日/周末等。
2. How to parameterize by date. I need to provide the data as sql script with date range parameterized. How to do the same in Sql Server. I tried using
DECLARE from_date='2015-04-01 00:00:00.000'
DECLARE to_date='2015-04-01 00:00:00.000'
SELECT * FROM TABLE
WHERE ....
AND [PI].Date BETWEEN ISNULL(@FromDate, [PI].Date) AND ISNULL(@ToDate, [PI].Date)
我使用下面的链接作为参考。 sql server optional parameters: syntax for between clause 任何帮助将不胜感激。
更新:表格结构。
出勤a - 主要密钥ID,与st_holiday表共享的st_id
st_holiday b,
- pk是ID,与hol_list表共享假日
hol_list c
- hol_date可与出勤日期表一起使用。
预期产出:
St_id IN_TIME OUT_TIME Hol_type
1234 2015-08-07 08:00:00.000 2015-08-07 17:00:00.000 null
1234 2015-08-08 08:00:00.000 2015-08-08 08:00:00.000 Weekend
表结构:st_id in attendance和st_holiday表不是唯一的。该值将重复。例如。 st_holiday中的eah st_id将有一年中有20个假期,即st_id重复20次。在考勤表中,st_id将取决于否。学生进来并离开教室的时间。
attendance
-------------
st_id in_time out_time time_in_class
3370 2009-10-8 11:54:0.0 2009-10-8 18:1:0.0 6.11666666666667
4209 0 0 0
4225 0 0 0
3779 2009-10-8 14:27:0.0 2009-10-9 0:5:0.0 9.63333333333333
hol_list
-------------
id hol_date type desc holiday_type
229 2007-04-06 00:00:00.000 1 Good Friday Holiday
231 2007-05-01 00:00:00.000 1 International Labor Day Holiday
233 2007-07-04 00:00:00.000 1 Independence Day Holiday
234 2007-07-07 00:00:00.000 1 Weekend Weekend
st_holiday
-------------
st_id holiday holiday_type
9201 39965 Holiday
9201 39961 Holiday
9201 39951 Holiday
9201 39942 Holiday
9201 39935 Weekend
9201 39927 Holiday
答案 0 :(得分:2)
根据您的示例查询和说明。对于您的第一个问题,请尝试一下:
select a.student_id, a.in_time, a.out_time, b.holiday_type
from attendance a
left join st_holiday b on a.st_id = b.st_id
inner join hol_list c on a.date = c.hol_date