来自多个表的SQL Server SELECT

时间:2015-07-14 21:05:50

标签: sql sql-server

我正在创建一个时间表应用并拥有以下表格...

tblTimeEntry

-entryID (int)
-entryDate (datetime)
-enteredDate (datetime)
-entryUser (int)
-entryJob (int)
-entryTask (int)
-entryWeekNo (int)

tblWagesWeeks

-weekID (int)
-weekDay (int)
-date (datetime)

tblWagesWeeks包含weekID,这是一个为每周分配一个int的int。 weekDay是1-7中的int,为每周的每一天分配一个int。已使用相应的tblWagesWeeks数字和weekDay数字在weekID中输入了三年的日期。

tblTimeEntry用于记录分配给日期的时间条目。

tblTimeEntry.entryWeekNo匹配tblWagesWeeks.weekID并且是一个表示周数的int。 tblTimeEntry.entryDatetblWagesWeeks.date匹配,且为datetime

因此,对于前端,我会显示一个显示周数的列表视图。用户点击一周,并显示该周的日期。当用户点击一天时,他们可以输入时间条目。

我遇到的问题是当我尝试使用以下查询列出一周的时间条目时...

SELECT 
    *,   
    CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
    CASE 
       WHEN entryHalfDay = '1' 
          THEN 'Half Day' 
       WHEN entryHalfDay = '0' 
          THEN '' 
    END AS [entryHalfDayString], 
    CASE 
       WHEN entryFullDay = '1' 
         THEN 'Full Day' 
       WHEN entryFullDay = '0' 
         THEN '' 
    END AS [entryFullDayString], 
    CASE 
       WHEN enteredDate IS NULL 
          THEN '' 
          ELSE 'Entry Complete' 
    END AS dayStatus 
FROM 
    tblWagesWeeks AS a 
LEFT JOIN 
    tblTimeEntry AS b ON a.[date] = b.entryDate 
WHERE 
    (entryUser = '1' OR entryUser IS NULL) AND weekID = '25'

我遇到的问题是,如果我正在搜索的用户(上面查询中的“1”)在特定日期没有时间条目而另一个用户没有时间条目,则列表中不显示空白日期所以用户没有机会输入当天的时间

以下是上述查询的输出,以演示......

weekID  weekDay date    entryID entryDate   enteredDate entryUser   entryJob    entryTask   entryFullDay    entryHalfDay    entryWeekNo dateFormatted   entryHalfDayString  entryFullDayString  dayStatus
25  1   2015-06-15  23  2015-06-15  2015-07-14  1   5   5   1   0   25  15/06/2015      Full Day    Entry Complete
25  2   2015-06-16  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    16/06/2015  NULL    NULL    
25  3   2015-06-17  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    17/06/2015  NULL    NULL    
25  4   2015-06-18  26  2015-06-18  2015-07-14  1   2   2   1   0   25  18/06/2015      Full Day    Entry Complete
25  5   2015-06-19  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    19/06/2015  NULL    NULL    
25  7   2015-06-21  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    21/06/2015  NULL    NULL    

如您所见,第6天缺失。

当我使用entryUser = 25搜索同一周时,您可以看到第6天有一个条目......

SELECT *, CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
CASE WHEN entryHalfDay='1' THEN 'Half Day' WHEN entryHalfDay='0' THEN '' END AS [entryHalfDayString], 
CASE WHEN entryFullDay='1' THEN 'Full Day' WHEN entryFullDay='0' THEN '' END AS [entryFullDayString], 
CASE WHEN enteredDate IS NULL THEN '' ELSE 'Entry Complete' END AS dayStatus 
FROM tblWagesWeeks AS a LEFT JOIN tblTimeEntry AS b ON a.[date] = b.entryDate 
WHERE (entryUser = '25' OR entryUser IS NULL) AND weekID = '25'

weekID  weekDay date    entryID entryDate   enteredDate entryUser   entryJob    entryTask   entryFullDay    entryHalfDay    entryWeekNo dateFormatted   entryHalfDayString  entryFullDayString  dayStatus
25  1   2015-06-15  23  2015-06-15  2015-07-14  1   5   5   1   0   25  15/06/2015      Full Day    Entry Complete
25  2   2015-06-16  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    16/06/2015  NULL    NULL    
25  3   2015-06-17  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    17/06/2015  NULL    NULL    
25  4   2015-06-18  26  2015-06-18  2015-07-14  1   2   2   1   0   25  18/06/2015      Full Day    Entry Complete
25  5   2015-06-19  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    19/06/2015  NULL    NULL    
25  7   2015-06-21  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    21/06/2015  NULL    NULL    

所以我需要知道如何始终在列表中显示所有工作日,空白并填充单个用户和一周的数字。

任何帮助都会受到大力赞赏。

1 个答案:

答案 0 :(得分:0)

您需要将连接的用户条件和周表作为主表的条件,如下所示:

SELECT *, CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
CASE WHEN entryHalfDay='1' THEN 'Half Day' WHEN entryHalfDay='0' THEN '' END AS [entryHalfDayString], 
CASE WHEN entryFullDay='1' THEN 'Full Day' WHEN entryFullDay='0' THEN '' END AS [entryFullDayString], 
CASE WHEN enteredDate IS NULL THEN '' ELSE 'Entry Complete' END AS dayStatus 
FROM tblWagesWeeks AS a 
LEFT JOIN tblTimeEntry AS b ON a.[date] = b.entryDate AND b.entryUser = 25
WHERE a.weekID = '25'