我有一个SQL表看起来像这样:SQL汇总查询
我想要做的就是添加了所有的“天”的,对于每一个日期,对于给定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,则为“false”,否则如果全部为0,则为“true”。我想问问数据库的问题是,“对于表中的所有日期,告诉我工作的总天数以及当天所有记录是否已被锁定,对于给定的员工”。所以,我想要的结果设置为显示为:
2013-06-20 1.00 TRUE
2013-06-21 0.75 FALSE
含义员工已经签署了他的工作,为20日(TRUE,所有记录都在锁定位字段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)
怎么样'newColumn = CASE MAX(锁定)在0 THEN '真' ELSE '假' END' –
newColumn = CASE MAX(CONVERT(INT,锁定)),当0,则 '真' ELSE'false'END – gareththegeek
我想他只有在所有“Locked”值为1时才需要TRUE ......这与任何“locked”值为0时所说的FALSE相同。因此,基于Aaron&Gareth的建议:newColumn = CASE MIN(CONVERT(INT,锁定))当0那么'假'其他'真'结尾 –