如何将聚合的计算列合并为一个 table

how to consolidate aggregated calculated columns into one table

我必须计算用于报告的聚合列并将它们全部放在一个 table 中。我创建了一个参考日期 table 来比较日期。

我的来源 table 看起来像(模拟数据)

memberid    startdate     enddate
1          2017-05-23    2017-06-21
2          2017-05-01    2017-06-17 
3          2017-04-23    2017-05-28
4          2017-06-01    2017-07-21
5          2017-04-30    2017-05-27

我必须每周进行计算,这将是 tableau 中的一种累积计算。例如,如果我想 运行 2017-06-04 的报告,那么我必须计算前一周的数据。 每周应该有以下指标。

1. how many members are new this week? count(Id's) where startdate >= 2017-05-28 
2. how many are discharged this week? count(Id's) where enddate=2017-05-27
3. how many are still in service? count(ID's) where startdate<=2017-05-28 and enddate >= 2017-05-28

我为 #1 和 #2 创建了聚合计算,但找不到 #3。 下面的计算是针对#1 和#2 完成的。 --新成员

1.select  DATEADD(DAY, 1 - DATEPART(WEEKDAY, c.pkdate), CAST(c.pkdate AS DATE)) as weekdate,count(distinct memberid) as newmembers from #tempauth t
join [dbo].[Calendardays] c
on dateadd(dd,-7,dateadd(dd,-1,weekstart)) =DATEADD(DAY, 1 - DATEPART(WEEKDAY, startdate), CAST(startdate AS DATE))
group by DATEADD(DAY, 1 - DATEPART(WEEKDAY, c.pkdate), CAST(c.pkdate AS DATE))

--出院

2.select  DATEADD(DAY, 1 - DATEPART(WEEKDAY, c.pkdate), CAST(c.pkdate AS DATE)) as weekdate,count(distinct memberid) as dischargedmembers from #tempauth t
join [dbo].[Calendardays] c
on dateadd(dd,-8,dateadd(dd,-1,weekstart)) =t.enddate
group by DATEADD(DAY, 1 - DATEPART(WEEKDAY, c.pkdate), CAST(c.pkdate AS DATE))

谁能帮我找出仍在服役的会员(#3)?另外,我必须计算这三个计算并在我的报告中放入单个 table。我该怎么做?

您可以计算前几周的相关日期(例如在 CTE 中)并将结果return作为子查询:

with cte as
 (
   select distinct
          DATEADD(dd, -(DATEPART(dw, pkdate) - 1), pkdate) as FirstDayOfWeek,
          DATEADD(DAY, 7 - (DATEPART(dw, pkdate)), pkdate) as LastDayOfWeek
     from dbo.Calendardays
    where pkdate <= dateadd(day, -8, getdate()) --> Calendardays until last week
 )
 select (select count(distinct memberid)
           from #tempauth t
           where t.StartDate >= cte.FirstDayOfWeek) as NewMembers,
        (select count(distinct memberid)
           from #tempauth t
          where ...)                                as DischargedMembers
        (select count(distinct memberid)
           from #tempauth t
          where ...)                                as MembersStillInService
      from cte;