使用sql确定奖励计划的成本

ldioqlga  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(324)

我有一个sql视图,它显示为零售公司生成的客户id、月份和收入(美元),如下所示。

+-----------+-----------+-------------------+
| CLIENT_ID |   MONTH   | REVENUE_GENERATED |
+-----------+-----------+-------------------+
|    29837  | Jan 2020  |            123362 |
|    12412  | Jan 2020  |              2973 |
|    12412  | Jan 2020  |              1824 |
|    54398  | Mar 2020  |                12 |
|    81724  | Mar 2020  |               436 |
+-----------+-----------+-------------------+

我想看看实施奖励计划的成本(就收入损失多少而言),该计划根据以下层级和折扣提供折扣(与产生的收入成比例):

+--------------+----------+
| REVENUE_TIER | DISCOUNT |
+--------------+----------+
| 0-250        | 0%       |
| 250-1000     | 1%       |
| 1000-2500    | 2%       |
| 2500-5000    | 4%       |
| 5000-10,000  | 6%       |
| >10,000      | 8%       |
+--------------+----------+

使用这些信息评估成本的最佳方法是什么?我想确定每个月每桶收入的损失额。
我假设首先为每一层创建bucket,每月统计每个bucket中的客户,然后根据每月每个bucket中的客户计数计算成本?i、 e.生成此

+----------+-------+----------+-----------+-----------+-------------+---------+
|  MONTH   | 0-250 | 250-1000 | 1000-2500 | 2500-5000 | 5000-10,000 | >10,000 |
+----------+-------+----------+-----------+-----------+-------------+---------+
| Jan 2020 |    99 |       28 |        47 |         5 |          65 |       0 |
| Feb 2020 |   128 |      188 |        17 |        84 |          98 |      47 |
| Mar 2020 |   122 |       67 |        12 |         1 |           1 |       1 |
+----------+-------+----------+-----------+-----------+-------------+---------+

然后将计数乘以收入层得到成本。
如果需要进一步澄清,我会在这里支持你。
生成计数表的sql代码:

SELECT
   MONTH,
   COUNT(CASE WHEN REVENUE_GENERATED <= 250 THEN 1 END) AS "0-250",
   COUNT(CASE WHEN REVENUE_GENERATED > 250 AND REVENUE_GENERATED <= 1000 THEN 1 END) AS "250-1000",
   COUNT(CASE WHEN RREVENUE_GENERATED > 1000 AND REVENUE_GENERATED <= 2500 THEN 1 END) AS "1000-2500",
   COUNT(CASE WHEN REVENUE_GENERATED > 2500 AND REVENUE_GENERATED <= 5000 THEN 1 END) AS "2500-5000",
   COUNT(CASE WHEN REVENUE_GENERATED > 5000 AND REVENUE_GENERATED <= 10000 THEN 1 END) AS "5000-10000",
   COUNT(CASE WHEN REVENUE_GENERATED > 10000 THEN 1 END) AS "+10000"
FROM
   REVENUE
GROUP BY
   MONTH;
zf9nrax1

zf9nrax11#

我建议您使用一个公共表表达式来定义层,并将其与您的收入结果连接起来,如下所示:

with
    sample (`client_id`, `month`, `revenue`) as (
        select '29837', 'jan 2020', 123362 union all
        select '12412', 'jan 2020', 2973 union all
        select '12412', 'jan 2020', 1824 union all
        select '54398', 'mar 2020', 12 union all
        select '81724', 'mar 2020', 436 
    ),
    tiers (`low`, `high`, `label`, `discount`) as (
        select 0, 249.999, '0-250', 0 union all
        select 250, 999.999, '250-1000', 1 union all
        select 1000, 2499.999, '1000-2500', 2 union all
        select 2500, 5999.999, '2500-5000', 4 union all
        select 5000, 9999.999, '5000-10000', 6 union all
        select 10000, 9999999.999, '>10000', 8
)   
select 
    sample.*, 
    tiers.label, 
    tiers.discount, 
    (revenue * (discount / 100)) revenue_discount
from
    sample 
    join tiers on sample.revenue between tiers.low and tiers.high

看看这个演示。

相关问题