【问题标题】:How to loop over table variable to make specific calculations?如何循环表变​​量以进行特定计算?
【发布时间】:2015-04-08 09:02:10
【问题描述】:

如果我有一个像这样的表变量,如何循环这个变量来进行一些处理:

DECLARE @userData TABLE(
                                    userId int NOT NULL,
                                    dayDate datetime NOT NULL,
                                    transIn datetime NULL,
                                    transOut datetime NULL,
                                    attIn datetime NULL,
                                    attOut datetime NULL,
                                    MissionIn datetime NOT NULL,
                                    MissionOut datetime NOT NULL,
                                    empState varchar(10) NULL
                                   );


                INSERT INTO @userData
                SELECT userid, trans_date,transtime_in,transtime_out,att_start_time,att_end_time,@Mission_fromdatetime,@Mission_todatetime,day_flag
                FROM datatable_o a
                WHERE a.userid = @userid AND a.trans_date = @date ORDER BY  transtime_in ;

根据 cmets 的整体情况:

如果工作开始于:att_start_time,结束于att_end_time(工作时间)

每个员工都可以在同一日期多次入住和退房,以便我们跟踪他。 签到存储在transtime_in 和结帐存储在transtime_out

我有day_flag,所以我可以知道这一天是“W”工作日还是“E”周末

现在考虑除了emp_num ,date之外的所有这些信息

我想为员工External mission over time 计算:

我有四种情况:

  1. 没有签到&&不是工作日[周末]所以员工 应将所有任务期间视为加班
  2. 没有签到&&工作日[缺席],所以员工应该 仅将任务期间从工作期间中取出
  3. 有退房 && 非工作日 [周末] 所以 员工应该只从这些任务中取出任务期间 退房
  4. 有签到&&工作日所以员工应该采取 仅在这些签到之外的任务期间,同时 下班时间。

例子:

emp_num     date         att_start   att_end    mission-in  mission-out
  672      2015-3-4       07:05:00    13:30:00   12:12:00    20:00:00

emp_num      date         trans_in     trans_out 

 672       2015-3-4       06:54:00     11:10:00
 672       2015-3-4       12:00:00     14:05:00

【问题讨论】:

  • 您要进行什么样的处理? SQL 通常不喜欢循环。最好将数据作为一个集合来处理。如果您提供更多详细信息,则可以避免使用循环,从而提高结果查询的性能。
  • 您还应该知道,表格本身没有顺序。由于在您的 SELECT 查询(例如 TOPFETCH 子句)中没有执行任何限制,所以 ORDER BY 完全没有意义。
  • @Aidan 我想计算并插入另一个表
  • @just_name - 澄清根本没有帮助。我们的意思是您要执行的具体计算是什么?您当前的方法似乎非常程序化(首先我会这样做并将结果放在一个表格中,然后我会这样做并将这些结果放在一个表格中,然后我会做下一件事……)。当您可以构建一个单独的查询来描述您想要什么,而不是如何做到这一点,然后让查询优化器确定如何最好地实现该结果时,SQL 的效果最好。
  • 如果这就是您想要做的......根据该逻辑编写查询并将结果插入表中。根据您的描述,我们将假设您不需要循环,而您假设您需要。如果您解释了您要做什么,也许我们可以停止假设并开始提供帮助。

标签: sql sql-server sql-server-2012 table-variable


【解决方案1】:

您可以通过从该表的副本获取帮助来遍历您的表:

关于你的问题,假设你的桌子是:

DECLARE @userData TABLE(
                         userId int NOT NULL,
                         /*Other fields*/
                        );

你表的数据是:

INSERT INTO @userData
/*A SELECT or values*/

现在创建一个表的副本:

DECLARE @userData_2 TABLE(
                         userId int NOT NULL,
                         /*Structure should be the same as @userData*/
                        );
INSERT INTO @userData_2
SELECT * FROM  @userData

现在您可以执行循环并做任何您想做的事情:

DECLARE @userId INT
WHILE EXISTS (SELECT * FROM @userData_2)
BEGIN
SET @userId=(SELECT TOP 1 userId FROM @userData)
/*

DO YOUR TRANSACTION HERE

*/
DELETE FROM @userData_2 WHERE userId=@userID
END

注意:这假设 userId 是唯一的,如果不是,那么您需要有一个唯一的字段,或者使用复合字段而不是 userId。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2022-01-07
    • 2021-12-10
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多