【问题标题】:Daily snapshot table using cte loop使用 cte 循环的每日快照表
【发布时间】:2018-11-08 15:44:12
【问题描述】:

我需要每天有多少员工在某一天(定义为 Start_Date 和 End_Date 之间的@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

【问题讨论】:

  • 查看行和分区我认为这会做你想要的。 codeproject.com/Articles/308281/…
  • 注意 - 您每次通过循环都会截断 #PLEASEWORK,因此当您使用这种方法从中选择时,您只会有 1 行。
  • @msturek 对不起,那些应该已经被注释掉了,只有 INSERT INTO 处于活动状态。

标签: sql common-table-expression sql-server-2016


【解决方案1】:

您可以在一个查询中完成所有这些操作。这是一种方法(不是最有效的),但一个月应该没问题。

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;

使用EmpMaster(Division_Description, start_date, leaving_date) 上的索引,这应该比基于游标的方法好得多。

【讨论】:

  • 是的,这非常适合我,谢谢!我以前不熟悉写交叉应用,这是我出错的地方。
  • @ElleeZee 。 . .此代码不使用cross apply
  • 更有趣的是,交叉连接,抱歉。
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 2012-10-07
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多