Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用cte循环的每日快照表_Sql_Common Table Expression_Sql Server 2016 - Fatal编程技术网

Sql 使用cte循环的每日快照表

Sql 使用cte循环的每日快照表,sql,common-table-expression,sql-server-2016,Sql,Common Table Expression,Sql Server 2016,我需要每天的快照,记录在开始日期和结束日期之间定义为@date的某一天雇佣了多少员工,每个日期一行 有一次,下面的脚本将返回所有每日快照,但它们都在单独的结果窗口中返回。我无法让查询合并所有结果以将每个新结果插入PLEASEWORK 我需要让下面的工作连续两天。它使用int日期。我继承了这个问题,正在构建一个日期表来解决这个问题 CREATE TABLE #PLEASEWORK ( [Date] INT ,Division_Description VARCHAR (100)

我需要每天的快照,记录在开始日期和结束日期之间定义为@date的某一天雇佣了多少员工,每个日期一行

有一次,下面的脚本将返回所有每日快照,但它们都在单独的结果窗口中返回。我无法让查询合并所有结果以将每个新结果插入PLEASEWORK

我需要让下面的工作连续两天。它使用int日期。我继承了这个问题,正在构建一个日期表来解决这个问题

CREATE TABLE #PLEASEWORK
(
    [Date] INT
    ,Division_Description VARCHAR (100)
    ,[Count] INT
)

DECLARE @cnt AS INT
DECLARE @DATE AS INT

SET @CNT = '20181001'

WHILE @cnt >= @DATE

BEGIN

SELECT @DATE = '20181031' - 1


TRUNCATE TABLE #PLEASEWORK
INSERT INTO #PLEASEWORK

SELECT
    @DATE [date]
    ,Division_Description
    ,COUNT(*) [Count]
--INTO #PLEASEWORK
FROM EmpMaster

WHERE
    ([Start_Date] <= @DATE
    AND Leaving_Date = 0)
    OR ([Start_Date] <= @DATE
    AND Leaving_Date > @DATE)

GROUP BY
    Division_Description


SET @cnt = @cnt + 1

CONTINUE


SELECT *

FROM #PLEASEWORK

END

您可以在一个查询中完成所有这些操作。这里有一种方法不是最有效的,但是可以用一个月

declare @DATESTART date = '20181001';
declare @DATEEND date = '20181031';

with dates as (
      select @DATESTART as dte
      union all
      select dateadd(day, 1, dte)
      from dates
      where dte < @DATEEND
     )
select d.dte, dd.Division_Description,
       (select count(*)
        from EmpMaster e
        where e.Division_Description = dd.Division_Description and
              e.start_date <= d.dte and
              (e.leaving_date >= d.dte or e.leaving_date is null)
       ) as num_employees
from dates d cross join
     (select distinct Division_Description from EmpMaster) dd
order by d.dte, dd.Division_Description;

在EMPSMasterDivision\u Description、start\u date、Leave\u date上有一个索引,这应该比基于光标的方法好得多。

查看行和分区,我认为这会满足您的需要。注意-您每次都在循环中截断PLEASEWORK,因此使用此方法从中选择时,您只能有一行。@msturek抱歉,这些应该在插入到活动中时注释掉。是的,这非常适合我,谢谢!我以前不熟悉写十字架申请书,这就是我出错的地方。@Ellezee。此代码不使用交叉应用。更有趣的是,交叉连接,表示歉意。