新客户与老客户 sql

new vs old customers sql

我正在尝试获取新客户与回头客,为此我必须创建多个表。有没有更好的方法来聚合如下所示的数据:

我的 SQL 代码如下所示:

---- ALL INDIVIDUALS WHO PURCHASED IN CURRENT WEEK---------
CREATE TABLE PURCHASES_FEB_WK2 AS (Select DISTINCT INDIVIDUAL_ID
from DM_OWNER.TRANSACTION_DETAIL_MV
WHERE BRAND_ORG_CODE = 'BRAND'
and is_merch = 1
and currency_code = 'USD'
AND LINE_ITEM_AMT_TYPE_CD = 'S'
AND TRUNC(TXN_DATE) BETWEEN '10-FEB-19' AND '16-FEB-19')


----------MINIMUM PURCHASE DATE OF ALL CUSTOMERS------------
Create table feb_wk2_min as
Select distinct Individual_ID, MIN(TRANSACTION_DATE) as FIRST_TRANSACTION
from dm_owner.transaction_mv
WHERE BRAND_ORG_CODE = 'BRAND'
and transaction_type_code in ('PR','EP')
group by individual_ID;


------- NEW CUSTOMERS FOR THE WEEK---------
Select Count(distinct B.INDIVIDUAL_ID) 
from PURCHASES_FEB_WK2 A
JOIN FEB_WK2_MIN B ON A.INDIVIDUAL_ID = B.INDIVIDUAL_ID
where FIRST_TRANSACTION between '10-FEB-19' and '16-FEB-19'


---- ALL RETURNING CUSTOMERS
SELECT COUNT (DISTINCT INDIVIDUAL_ID)
FROM PURCHASES_FEB_WK2 
WHERE INDIVIDUAL_ID IN (SELECT INDIVIDUAL_ID FROM DM_OWNER.TRANSACTION_DETAIL_MV WHERE TRUNC(TXN_DATE) < '10-FEB-19' AND BRAND_ORG_CODE = 'BRAND' AND IS_MERCH = 1 AND line_item_amt_type_cd = 'S' AND STATUS = 'A')





-------NEW CUSTOMERS DOLLAR_VALUE_US------
SELECT SUM(DOLLAR_VALUE_US) FROM DM_OWNER.TRANSACTION_DETAIL_MV 
WHERE INDIVIDUAL_ID IN (Select distinct B.INDIVIDUAL_ID 
from PURCHASES_FEB_WK2 A
JOIN FEB_WK2_MIN B ON A.INDIVIDUAL_ID = B.INDIVIDUAL_ID
where FIRST_TRANSACTION between '10-FEB-19' and '16-FEB-19')
AND BRAND_ORG_CODE = 'BRAND'
and is_merch = 1
and currency_code = 'USD'
AND LINE_ITEM_AMT_TYPE_CD = 'S'
AND TRUNC(TXN_DATE) BETWEEN '10-FEB-19' AND '16-FEB-19'




-------RETURNING CUSTOMERS DOLLAR_VALUE_US------
SELECT SUM(DOLLAR_VALUE_US) FROM DM_OWNER.TRANSACTION_DETAIL_MV 
WHERE INDIVIDUAL_ID IN (SELECT DISTINCT INDIVIDUAL_ID
FROM PURCHASES_FEB_WK2 
WHERE INDIVIDUAL_ID IN (SELECT INDIVIDUAL_ID FROM DM_OWNER.TRANSACTION_DETAIL_MV WHERE TRUNC(TXN_DATE) < '10-FEB-19' AND BRAND_ORG_CODE = 'BRAND' AND IS_MERCH = 1 AND line_item_amt_type_cd = 'S' AND STATUS = 'A'))
AND BRAND_ORG_CODE = 'BRAND'
and is_merch = 1
and currency_code = 'USD'
AND LINE_ITEM_AMT_TYPE_CD = 'S'
AND TRUNC(TXN_DATE) BETWEEN '10-FEB-19' AND '16-FEB-19'

为了获取数量和订单数量,我将总和 (dollar_value_us) 替换为不同订单的数量和数量总和。有没有一种简单的方法来旋转和组合此代码,以便我可以按照我提供的格式(附图片)复制粘贴数据。

根据评论,我了解到您想将客户分为两组:在此期间进行首次交易的客户应与之前进行过交易的客户分开。对于每个组,您想要计算客户数量并对交易价值求和。

注意:您的 sql 代码不显示热计算 qtycount_of_orders,所以我把它分开(但这可能遵循相同的逻辑)。

鉴于此示例数据:

INDIVIDUAL_ID | DOLLAR_VALUE_US | TXN_DATE  | RAND_ORG_CODE | IS_MERCH | CURRENCY_CODE | LINE_ITEM_AMT_TYPE_CD
------------: | --------------: | :-------- | :------------ | -------: | :------------ | :--------------------
            1 |              10 | 01-FEB-19 | BRAND         |        1 | USD           | S                    
            1 |              10 | 10-FEB-19 | BRAND         |        1 | USD           | S                    
            1 |              10 | 15-FEB-19 | BRAND         |        1 | USD           | S                    
            1 |              10 | 28-FEB-19 | BRAND         |        1 | USD           | S                    
            2 |              11 | 11-FEB-19 | BRAND         |        1 | USD           | S                    
            2 |              11 | 12-FEB-19 | BRAND         |        1 | USD           | S                    
            3 |              11 | 12-FEB-19 | BRAND         |        1 | USD           | S                    

考虑到包括 2 月 10 日到 16 日在内的一周范围,客户 1 是回头客,在 window 中有 2 笔交易,客户 23 是新客户分别进行了 2 次和 1 次交易。您会期望以下输出:

TYPE_OF_CUSTOMER    | COUNT_OF_CUSTOMERS | SUM_DOLLAR_VALUE_US
:------------------ | -----------------: | ------------------:
New Customers       |                  2 |                  33
Returning Customers |                  1 |                  20

要解决这个问题,您需要设置多个级别的聚合。首先,使用window函数MIN() OVER()恢复每个客户第一笔交易的日期。然后,筛选分析期,将客户分成 new/returning 组,并汇总花费的金额。最后,将所有结果汇总在一起。

查询:

SELECT
    DECODE(is_new, 1, 'New Customers', 'Returning Customers') type_of_customer,
    COUNT(individual_id) count_of_customers,
    SUM(dollar_value_us) sum_dollar_value_us
FROM (
    SELECT
        individual_id,
        SUM(dollar_value_us) dollar_value_us,
        CASE WHEN MIN(txn_date) = min_txn_date THEN 1 ELSE 0 END is_new
    FROM (
        SELECT 
            individual_id, 
            dollar_value_us,
            txn_date,
            MIN(txn_date) OVER(PARTITION BY individual_id) min_txn_date   
        FROM transaction_detail_mv   
        WHERE 
            rand_org_code = 'BRAND'
            AND is_merch = 1
            AND currency_code = 'USD'
            AND line_item_amt_type_cd = 'S'
    ) t
    WHERE 
        txn_date >= TO_DATE('10-02-2019', 'DD-MM-YYYY') 
        AND txn_date < TO_DATE('17-02-2019', 'DD-MM-YYYY')
    GROUP BY
        individual_id,
        min_txn_date
) x GROUP BY is_new

这个demo on DB Fiddle演示了计算的每一步。