2011-12-08 58 views
0

我需要显示一份报告,该报告将显示每周的培训课程报告..从星期一到星期六的某个时间星期日,每天的参加者人数。 我想sql查询来完成这个任务。 例如。如何在两个不同日期之间获得日期(星期一,星期二.....)?

code days mon tues Wed thurs fri sat sun 
10001 3  22 22 22 0  0 0 0 
10002 5  10 10 10 10 10 0 0 and so on.... 

这里没有。的参与者在该训练课程的所有日期内都是相同的。

更新查询

.....................我的查询按照@competent_tech建议.......... ...............

CREATE VIEW SessionDOW 
AS 
SELECT tcapp_id,title, 
case when programtype=1 then 'YP' else 'SP' end programtype, 
case when NonResidential=2 then 'Res' else 'Non Res.' end nonresidential,duration, 
fromdate,TODATE, 
Training_Calendar.Participents, 
     StartDOW = DATEPART(weekday, FromDate) , 
     EndDOW = DATEPART(weekday, FromDate)+Duration -1, 

      weekenddate=DATEPART(d,CONVERT(date,'12-12-2011'))+6 
    FROM Training_Calendar 

GO 

select * from sessiondow 

CREATE VIEW SessionDays 
AS 
    SELECT SessionDOW.*, 
     MON = CASE WHEN (2 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 2 + 7) THEN Participents ELSE 0 END , 
     TUE = CASE WHEN (3 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 3 + 7) THEN Participents ELSE 0 END , 
     WED = CASE WHEN (4 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 4 + 7) THEN Participents ELSE 0 END , 
     THURS = CASE WHEN (5 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 5 + 7) THEN Participents ELSE 0 END , 
     FRI = CASE WHEN (6 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 6 + 7) THEN Participents ELSE 0 END , 
     SAT = CASE WHEN (7 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 0 + 7) THEN Participents ELSE 0 END, 
      SUN = CASE WHEN (1 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 1 + 7) THEN Participents ELSE 0 END 
    FROM SessionDOW 
GO 


SELECT e.* 
FROM SessionDays e INNER JOIN Training_Calendar a ON e.tcapp_id = a.TCApp_Id 
GROUP BY e.TCApp_Id,e.title, 
e.programtype, 
e.nonresidential,e.duration, 
e.Participents, 
e.StartDOW , 
e.EndDOW,sun,MON,tue,wed,thurs,fri,SAT,e.FromDate,e.todate,e.weekenddate 

这给我从12月12日以下结果

tcapp_id title programtype nonresidential duration fromdate TODATE Participents StartDOW EndDOW weekenddate MON TUE WED THURS FRI SAT SUN 
2011-12/CHD-10001 testing SP Res 10 2011-12-05 2011-12-14 60 2 11 18 60 60 60 60 60 60 60 
2011-12/CIT-10001 Training of Palak Technical Officer YP Res 2 2011-12-13 2011-12-14 45 3 4 18 0 45 45 0 0 0 0 
2011-12/SIRD-10001 Induction Level Training Programme for JE's of MESCT YP Res 4 2011-12-12 2011-12-15 25 2 5 18 25 25 25 25 0 0 0 
2011-12/SIUD-10001 Extempore Leadership Skills Workshop SP Non Res. 5 2011-12-14 2011-12-18 35 4 8 18 0 0 35 35 35 35 35 
2011-12/SIUD-10002 fdgd YP Res 6 2011-12-15 2011-12-20 80 5 10 18 80 80 0 80 80 80 80 

这里一周的开始和结束,从12月18日,但训练开始5月12日,并于14日结束,但接下来的几天( 15,16,17,18)显示参与者的价值。请帮忙。

+5

这完全取决于数据库的结构。 – ThePower

+0

哪个数据库? – Johan

回答

0

如果这是一个SQL Server数据库,然后将查询将沿着线的东西:

SELECT CODE , 
     SUM(1) AS DAYS , 
     SUN = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 0 THEN 1 ELSE 0 END) , 
     MON = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 1 THEN 1 ELSE 0 END) , 
     TUE = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 2 THEN 1 ELSE 0 END) , 
     WED = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 3 THEN 1 ELSE 0 END) , 
     THURS = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 4 THEN 1 ELSE 0 END) , 
     FRI = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 5 THEN 1 ELSE 0 END) , 
     SAT = SUM(CASE WHEN DATEPART(weekday, TimeStamp) = 6 THEN 1 ELSE 0 END) 
    FROM Event 
GROUP BY code 

哪里Timestamp是包含训练和Event日期列的名称是名桌子。

更新

上面的查询假定一个记录在数据库中存在的每个学生,他们上课的每一天。

但是,如果数据库设计为会话的一条记录指定了开始日期和天数以及另一个与会者针对给定会话注册的表,则查询会有所不同。

假设下面的粗糙表结构:

CREATE TABLE Sessions 
(
    code INT NOT NULL IDENTITY(1, 1) , 
    date DATETIME NOT NULL , 
    DAYS INT NOT NULL , 
    PRIMARY KEY (code) 
) 
CREATE TABLE Attendees 
(
    id INT NOT NULL IDENTITY(1, 1) , 
    code INT NOT NULL , 
    NAME NVARCHAR(100) 
    PRIMARY KEY (id) , 
    FOREIGN KEY (code) REFERENCES sessions (code) 
) 

我们首先创建一个视图来计算一周的开始和结束日期(这使得随后的观点更容易理解):

CREATE VIEW SessionDOW 
AS 
    SELECT CODE , 
     DAYS , 
     StartDOW = DATEPART(weekday, date) , 
     EndDOW = DATEPART(weekday, date) + DAYS 
    FROM Sessions 
GO 

我们然后创建一个视图来记录会话运行一周中的每一天。需要注意的是这种观点考虑到跨越两个星期会话:

CREATE VIEW SessionDays 
AS 
    SELECT CODE , 
     DAYS , 
     SUN = CASE WHEN (0 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 0 + 7) THEN 1 ELSE 0 END , 
     MON = CASE WHEN (1 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 1 + 7) THEN 1 ELSE 0 END , 
     TUE = CASE WHEN (2 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 2 + 7) THEN 1 ELSE 0 END , 
     WED = CASE WHEN (3 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 3 + 7) THEN 1 ELSE 0 END , 
     THURS = CASE WHEN (4 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 4 + 7) THEN 1 ELSE 0 END , 
     FRI = CASE WHEN (5 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 5 + 7) THEN 1 ELSE 0 END , 
     SAT = CASE WHEN (6 BETWEEN StartDOW AND EndDOW) OR (EndDow >= 6 + 7) THEN 1 ELSE 0 END 
    FROM SessionDOW 
GO 

最后,我们加入了sessiondays与学生数出席每次会议,并添加了值:

SELECT e.CODE , 
     MAX(DAYS) AS DAYS , 
     SUN = SUM(SUN) , 
     MON = SUM(MON) , 
     TUE = SUM(TUE) , 
     WED = SUM(WED) , 
     THURS = SUM(THURS) , 
     FRI = SUM(FRI) , 
     SAT = SUM(SAT) 
    FROM SessionDays e INNER JOIN Attendees a ON e.code = a.code 
GROUP BY e.code 
+0

感谢competent_tech。 –

+0

thanks competent_tech。但我想不显示。的参加者。如果培训课程是从星期一到星期三开始,然后是报告,星期一,星期二和星期三的培训课程为期3天。应该是25或者其他什么训练课程。在这里,我可以传递多个日期而不是单个日期? –

+0

@Mayur_Vartak:查询的结构将如何完全取决于您的数据库。我的答案中的查询的设计假设每个学生的存在都会在会话的每一天分别记录,这可能很重要,具体取决于您的需求。例如,如果有两名学生错过了最后一天,这很重要吗?或者你只需​​要知道有多少人登记或第一天在那里? –

相关问题