新老客户sql

时间:2019-03-01 22:16:39

标签: sql oracle oracle-sqldeveloper

我试图获得新客户与回头客户的关系,为此,我必须创建多个表。有没有更好的方法来汇总如下所示的数据:

FORMAT PICTURE

我的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)。有没有简单的方法可以透视和组合此代码,以便我可以按提供的格式(粘贴图片)复制粘贴数据。

1 个答案:

答案 0 :(得分:1)

基于这些评论,我了解到您希望将客户分为两组:在此期间进行首次交易的客户应与之前进行过交易的客户分开。对于每个组,您要计算客户数量并汇总交易额。

NB:您的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是回头客,窗口中有2笔交易,客户23是分别有2和2的新客户1笔交易。您将期待以下输出:

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

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

查询:

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 演示了计算的每个步骤。