2013-07-01 154 views
0

我有一个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) 
+1

怎么样'newColumn = CASE MAX(锁定)在0 THEN '真' ELSE '假' END' –

+0

newColumn = CASE MAX(CONVERT(INT,锁定)),当0,则 '真' ELSE'false'END – gareththegeek

+0

我想他只有在所有“Locked”值为1时才需要TRUE ......这与任何“locked”值为0时所说的FALSE相同。因此,基于Aaron&Gareth的建议:newColumn = CASE MIN(CONVERT(INT,锁定))当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) 
+0

哦忘了说,生产服务器将是2008.不确定IFF是否是我的目的t-sql的一部分? – Robinson

+0

IIF是在SQL 2012中添加的。您可以按照上面的建议将其替换为CASE。 –

+0

好吧,我会将其标记为答案,因为它非常正确,除非您需要从MAX切换到MIN,如上面的编辑所示。即如果MIN = 0,那么我们有一个解锁记录,因此我们没有“锁定”该日期的所有记录。 – Robinson