带有位字段的SQL聚合查询

时间:2013-07-01 15:18:39

标签: sql-server aggregate-functions

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

1 个答案:

答案 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)