2014-02-19 87 views
1

我需要计算每小时有多少人在工作。我有两个表:根据另一个时间间隔更新表。 SQL Server

Hour  Men 
------------ 
6  0 
7  0 
8  0 
9  0 
10  0 
11  0 
12  0 

其中"Men"列是男性的数量。另一个表是:

ClockedInHour  ClockedOutHour 
6     10 
7     10 
8     12 
6     11 
9     12 

所以在第二个表中的每个条目,我需要增加在第一个表"Men""ClockedInHour""ClockedOutHour"包括那些在表之间每隔一小时,而且,如果可能的话,做它没有光标。

附加条件:它将成为表值函数的一部分。

在此先感谢您的帮助。

回答

1

解决了!

DECLARE @Hour6 INT 
SET @Hour6 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 6 and ClockedInHour <= 6) 
DECLARE @Hour7 INT 
SET @Hour7 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 7 and ClockedInHour <= 7) 
DECLARE @Hour8 INT 
SET @Hour8 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 8 and ClockedInHour <= 8) 
DECLARE @Hour9 INT 
SET @Hour9 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 9 and ClockedInHour <= 9) 
DECLARE @Hour10 INT 
SET @Hour10 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 10 and ClockedInHour <= 10) 
DECLARE @Hour11 INT 
SET @Hour11 = (SELECT COUNT(*) FROM @table2 where ClockedOutHour >= 11 and ClockedInHour <= 11) 
DECLARE @Hour12 INT 
SET @Hour12 = (SELECT COUNT(*) FROM @tc where ClockedOutHour >= 12 and ClockedInHour <= 12) 

UPDATE @table1 SET Man = @Hour6 WHERE Hour = 6 
UPDATE @table1 SET Man = @Hour7 WHERE Hour = 7 
UPDATE @table1 SET Man = @Hour8 WHERE Hour = 8 
UPDATE @table1 SET Man = @Hour9 WHERE Hour = 9 
UPDATE @table1 SET Man = @Hour10 WHERE Hour = 10 
UPDATE @table1 SET Man = @Hour11 WHERE Hour = 11 
UPDATE @table1 SET Man = @Hour12 WHERE Hour = 12 
0

您可以使用插入触发器为做到这一点:

Go --terminate all preceding batch of statements 

CREATE TRIGGER tg_MenCount ON dbo.table2 For INSERT 
AS 
SET XACT_ABORT, NOCOUNT ON 
--Ignore zero row updates, inserts 
IF NOT EXISTS (SELECT * FROM INSERTED) RETURN; 

BEGIN TRY 
    UPDATE T1 
    set T1.men = T1.men +1 
    FROM 
     table1 T1 
     INNER JOIN INSERTED I 
     ON T1.hour between I.ClockedInHour and I.ClockedOutHour 
END TRY 
BEGIN CATCH 
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION 
    --RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc] 
END CATCH 
GO 
+0

这应该是表值函数的一部分。你的代码给我一个错误:“'CREATE TRIGGER'必须是查询批处理中的第一条语句。” –

+0

这是因为您可能会在正在进行的批次中添加此定义。用Go语句终止该批次。 – Deepshikha

+0

在这种情况下,我没有访问先前声明的表变量,它们代表来自原始文章 –

相关问题