【发布时间】:2015-08-12 02:15:36
【问题描述】:
我在 SQL 连接概念上苦苦挣扎,并且在尝试获取学生出勤记录时遇到了问题。有 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_id 与 st_holiday 表共享
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 出勤表和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
【问题讨论】:
-
能否提供表格结构、一些示例数据和预期结果?
-
st_holiday与hol_list有什么关系?holiday是什么数据类型? -
hol_list 主键 id 映射为 st_holiday 表中的假日。
-
我建议你创建一个SQL FIDDLE 这样很容易重现你的问题并给你一个合适的解决方案。
-
当人们询问表结构时,如果您将其提供为
CREATE TABLE语句(您可以通过右键单击 SSMS 中的表并选择将表格编写为 -> 创建到并选择要发送到的位置)。这样,其他人可以直接将这些定义复制并粘贴到他们的 SQL Server 中,并且更接近于准备好帮助您。同样,INSERT语句是呈现示例数据的好方法 - 因为,同样,我们可以将其复制并粘贴到 SSMS 中,并准备好处理实际查询。而不必解释。
标签: sql sql-server join