动态SQL填充Triangulation / Cross-tab表

时间:2017-04-20 08:09:08

标签: sql sql-server pivot-table dynamic-sql crosstab

美好的一天, 我在填充我创建的矩阵表时遇到问题,该矩阵表测量下降的百分比或在选定的日期范围内取消。

让我从头开始。 例如,选择日期范围参数。 '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

任何人都可以帮助我吗?

0 个答案:

没有答案