我有一个如下所示的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添加每个日期的所有" Days"。我设法找出一个如下所示的查询:
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在21日工作1个工作日,21日工作时间为3/4工作日。一年中的任何一天都可以有任意数量的个人记录,因为给定的员工可能在不同的ID_Tasks上工作了不同的时间。
现在我要做的是在结果集中添加另一个字段,' s" false"如果任何一个记录有"锁定"设置为1,否则" true"如果他们都是0。用简单的语言,我想问数据库的问题是,#34;对于表中的所有日期,告诉我工作的总天数以及当天的所有记录是否已被锁定,对于给定的员工"。所以我希望结果集显示的是:
2013-06-20 1.00 TRUE
2013-06-21 0.75 FALSE
表示员工已签署20日工作(TRUE,所有记录在Locked位字段中都有1个),还有一个或多个记录尚未在21日签署,这意味着该员工有一个或多个记录在21日锁定位字段中有0。)
这有意义吗?无论如何,我无法理解这样做的最好方法。
任何可以提供协助的SQL天才?
编辑:
好的,感谢我从下面的答案中得到的想法,我在查询中添加了CASE行。基本上它说,"如果此日期任何记录的锁定中的最低数字为零,那么并非所有记录都已经签署,否则它们都已经被"。
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)
答案 0 :(得分:1)
SELECT CAST([Note].Date AS DATE) As Date,
SUM([Note].Days) AS Totalб
CASE WHEN MIN(Locked) = 0 THEN 'false' ELSE 'true' END AS SignedOff
FROM
Note
WHERE
[Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
GROUP BY
CAST(Note.Date AS DATE)