我有一个如下所示的 SQL 表:
ID uniqueidentifier
ID_Task uniqueidentifier
ID_Employee uniqueidentifier
Comment nvarchar(256)
Complete int
Date datetime
Days decimal(6, 2)
Locked bit
Created datetime
Edited datetime
Deleted bit
我想要做的是将给定 ID_Employee 的每个日期的所有“天数”相加。我设法制定了一个如下所示的查询:
SELECT CAST([Note].Date AS DATE) As Date,
SUM([Note].Days) AS Total
FROM
Note
WHERE
[Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
GROUP BY
CAST(Note.Date AS DATE)
这为我提供了每个唯一“日期”的总“天数”的结果集,例如:
2013-06-20 1.00
2013-06-21 0.75
,显示员工 E6A0E609-F8B2-4B48-A17C-4A4E117A4077 在 20 日工作了 1 个工作日,在 21 日工作了 3/4 个工作日。一年中的任何一天都可以有任意数量的个人记录,因为给定的员工可能在不同的 ID_Tasks 上工作了不同的时间。
现在我要做的是向结果集中添加另一个字段,如果任何一条记录的“锁定”设置为 1,则为“假”,如果它们全部为 0,则为“真”。用简单的语言问题我'我想问数据库是,“对于表中的所有日期,告诉我工作的总天数以及当天的所有记录是否已被锁定,对于给定的员工”。所以我希望结果集显示的是:
2013-06-20 1.00 TRUE
2013-06-21 0.75 FALSE
表示员工已在 20 日签署了他的工作(TRUE,所有记录在 Locked 位字段中都有 1),并且有一条或多条记录尚未在 21 日签署,这意味着该员工在 21 日有一条或多条记录在 Locked 位域中有一个 0)。
这有意义吗?无论如何,我无法理解这样做的最佳方式。
任何潜伏的SQL天才可以提供帮助吗?
编辑:
好的,感谢我从下面的答案中得到的想法,我将 CASE 行添加到查询中。基本上它说,“如果在此日期任何记录的 Locked 中的最低数字为零,则并非所有记录都已签署,否则它们都已签署”。
SELECT CAST([Note].Date AS DATE) As Date,
SUM([Note].Days) AS Total,
CASE MIN(CONVERT(INT, Locked)) WHEN 0 THEN 0 ELSE 1 END AS Locked
FROM
Note
WHERE
[Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
GROUP BY
CAST(Note.Date AS DATE)