美好的一天, 我在填充我创建的矩阵表时遇到问题,该矩阵表测量下降的百分比或在选定的日期范围内取消。
让我从头开始。 例如,选择日期范围参数。 '2016-01-01'到'2016-12-31'。 我已经拥有的代码创建了一个矩阵表,如下所示:
MonthN 2016-01 2016-02 2016-03 ... 2016-12
2016-01
2016-02
2016-03
...
2016-12
我有一个包含数据的表,例如AccountNumber,Startdate和CancelDate。
我需要做的是填充用值创建的表。 例如。如果在2016-01 30个帐户变为活动且3个在同一个月取消,则百分比为(@CxdPerentage =(@ CNY / @Active)* 100)= 10(%) 所以在2个日期对应的第一个单元格中,该值将为10 例如。
MonthN 2016-01 2016-02 2016-03 ... 2016-12
2016-01 10 null null null
2016-02 null null null null
2016-03 null null null null
...
2016-12 null null null null
这将创建,我假设最好的方式,使用Dynamic Sql和循环,我已经完成并得到如下结果:
MonthN 2016-01 2016-02 2016-03 2016-04 ... 2016-12
2016-01 10 null null null null
2016-02 null 5.00 null null null
2016-03 null null 2.61 null null
2016-04 null null null 1.96 null
...
2016-12 null null null null 3.12
交叉价值2016-02和2016-02为5.00的值是通过计算得出的,该计算计算当月所有已取消帐户的所有已激活帐户,因此当月再次销售40个,并在该月取消2个。
下一部分是填充下一个条目DOWN并且正在交叉,因此该表需要以下值:
MonthN 2016-01 2016-02 2016-03 2016-04 ... 2016-12
2016-01 10 null null null null
2016-02 13 6.60 null null null
2016-03 null ???? 2.61 null null
2016-04 null null ???? 1.96 null
...
2016-12 null null null ???? 3.12
这将计算自:在2016-01 30 30个账户变得活跃,其中3个在同一个月被取消,但在接下来的一个月,2016-02,最初的30个中有4个被取消,所以那里的价值将是4cxd / 30initial * 100 ((4/30)* 100)= 13(%下降)
最终结果看起来类似于: (插入Randoms数字以显示结果)
MonthN 2016-01 2016-02 2016-03 2016-04 ... 2016-12
2016-01 10.0 null null null null
2016-02 13.0 6.60 null null null
2016-03 7.00 9.00 2.61 null null
2016-04 5.00 8.00 5.00 1.96 null
...
2016-12 8.00 9.65 5.20 6.50 3.12
为了向您展示我如何创建我需要填充的初始表(矩阵),这里是代码。
DROP TABLE Reporting.DBO.Stats_Dbs -- Temp while im playing
DECLARE @sDATE DATE = '2015-04-01', -- 24 months
@eDATE DATE = '2017-04-01'
DECLARE @StatsStart DATE = @sDATE
DECLARE @StatsEnd DATE = @eDATE
DECLARE @Months TABLE (Months VARCHAR(10), StatsDB VARCHAR(12))
WHILE @StatsStart < @StatsEnd
BEGIN
BEGIN
INSERT INTO @Months
SELECT @StatsStart,
CONVERT(VARCHAR(7),@StatsStart,120)
END
SET @StatsStart = DATEADD(MONTH, +1, (CONVERT(DATE, @StatsStart, 120)))
END
DECLARE @strQry VARCHAR(MAX) = 'CREATE TABLE Reporting.Dbo.Stats_Dbs(MonthN VARCHAR(10),'
SELECT @strQry += '['+ StatsDB +'] VARCHAR(100),' FROM @Months
SELECT @strQry += ');'
PRINT(@strQry);
EXEC(@strQry);
INSERT INTO Reporting.DBO.Stats_Dbs(MonthN)
SELECT LEFT(Months, 7) FROM @Months
任何人都可以帮助我吗?