0

我有一个如下所示的 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)
4

1 回答 1

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)
于 2013-07-01T15:30:56.427 回答