【问题标题】:Churn Rate From Contract Start & End Dates合同开始和结束日期的流失率
【发布时间】:2019-09-20 12:00:33
【问题描述】:

我正在尝试计算客户的流失率,而我所要做的只是合同的开始和结束日期。

当日期年份为 9999 时,仅表示他们仍然是客户,我想只考虑任期超过 3 个月的帐户(例如在公司工作 3 个月或更长时间)。

CREATE TABLE #temp
(
 ACCOUNT varchar(20)NOT NULL
,CONTRACT_START_DATE DATETIME NOT NULL
,CONTRACT_END_DATE DATETIME NOT NULL
)
;


INSERT INTO #temp
VALUES('64074558792','20160729','20170805');
INSERT INTO #temp
VALUES('54654654664','20160810','20170110');
INSERT INTO #temp
VALUES('21454654764','20160112','20160812');
INSERT INTO #temp
VALUES('21654765134','20160101','20161231');
INSERT INTO #temp
VALUES('13214868794','20160811','99991231');
INSERT INTO #temp
VALUES ('88321546894','20160427','20160627');

SELECT *,
CASE WHEN CONTRACT_END_DATE <> '99991231' THEN DATEDIFF(DAY, CONTRACT_START_DATE,CONTRACT_END_DATE) ELSE null END AS TENURE
FROM #temp

【问题讨论】:

  • 请定义您所说的“流失率”。
  • 我试图找出 12 个月后有多少客户留在公司。
  • 一年内流失的客户总数,流失客户占客户总​​数的百分比。

标签: sql sql-server churn


【解决方案1】:

以下内容适用于单个报告年度。您似乎想要得到一些东西:

-停留时间超过 x 个月的客户数量

-停留超过 x 个月的客户百分比

-年内流失客户的百分比

DECLARE @records TABLE
(
 ACCOUNT varchar(20)NOT NULL
,CONTRACT_START_DATE DATETIME NOT NULL
,CONTRACT_END_DATE DATETIME NOT NULL
);

DECLARE @ReportingYear INT = 2016;
DECLARE @MinTenureMonths INT = 3;


INSERT INTO @records
VALUES('64074558792','20160729','20170805'),
('54654654664','20160810','20170110'),
('21454654764','20160112','20160812'),
('21654765134','20151011','20161231'),--I changed this one
('13214868794','20160811','99991231'),
('88321546894','20160427','20160627');

SELECT *,
[CustomerGained]    = IIF(YEAR(CONTRACT_START_DATE) = @ReportingYear,1,0),
[CustomerLost]      = IIF(YEAR(CONTRACT_END_DATE) = @ReportingYear,1,0) ,
[ExistingCustomer]  = IIF(CONTRACT_START_DATE < DATEFROMPARTS(@ReportingYear,1,1)
                        AND CONTRACT_END_DATE > DATEFROMPARTS(@ReportingYear,12,31), 1, 0),
[CurrentCustomer]   = IIF(CONTRACT_END_DATE = '99991231 00:00:00.000',1,0),
[MinTenureExceeded] = IIF(DATEDIFF(MONTH, CONTRACT_START_DATE, CONTRACT_END_DATE) >= @MinTenureMonths,1,0)
FROM @records;

With recordCTE AS
(
SELECT 
    [CustomersGained]   = SUM(IIF(YEAR(CONTRACT_START_DATE) = @ReportingYear,1,0)),
    [CustomersLost]     = SUM(IIF(YEAR(CONTRACT_END_DATE) = @ReportingYear,1,0)),
    [MinTenureExceeded] = SUM(IIF(DATEDIFF(MONTH, CONTRACT_START_DATE, CONTRACT_END_DATE) >= @MinTenureMonths,1,0)),
    [ExistingCustomers] = SUM(IIF(CONTRACT_START_DATE < DATEFROMPARTS(@ReportingYear,1,1)
                            AND CONTRACT_END_DATE > DATEFROMPARTS(@ReportingYear,12,31), 1, 0)),
    [CurrentCustomer]   = SUM(IIF(CONTRACT_END_DATE = '99991231 00:00:00.000',1,0)),
    [TotalCustomers]    = COUNT(1)
FROM @records
)

SELECT  c.CustomersGained,
        c.CustomersLost,
        c.MinTenureExceeded,
        c.ExistingCustomers,
        [% Lost] = CAST(((c.CustomersLost * 1.0) / c.TotalCustomers) * 100 AS DECIMAL(14,2)),
        [% Gained] = CAST(((c.CustomersGained * 1.0) / c.TotalCustomers) * 100 AS DECIMAL(14,2))
FROM recordCTE c;

您需要确定是仅查找单个报告年度、报告期间还是所有内容的总和。如果您想要一切,只需使用 CurrentCustomers 进行所有计算。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多