2017-07-14 106 views
0

我试图找到一个查询,将给我在同一个月与2个不同实体进行交易的客户数量。换句话说,在同一个月内与company_a和company_b进行交易的customer_ids。以下是我迄今为止:SQL查询到组ID重叠(通过内部联接)按月

SELECT Extract(year FROM company_a_customers.transaction_date) 
     || Extract(month FROM company_a_customers.transaction_date) AS 
     payment_month, 
     Count(UNIQUE(company_a_customers.customer_id)) 
FROM (SELECT * 
     FROM my_table 
     WHERE (merchant_name LIKE '%company_a%')) AS company_a_customers 
     INNER JOIN (SELECT * 
        FROM my_table 
        WHERE (merchant_name = 'company_b')) AS 
        company_b_customers 
       ON company_a_customers.customer_id = 
        company_b_customers.customer_id 
GROUP BY Extract(year FROM company_a_customers.transaction_date) 
      || Extract(month FROM company_a_customers.transaction_date) 

的问题是,这是给我一个运行总计与A公司的交易在一个月按一个月基础上所有的客户谁也曾经与公司交易B.

如果我惠特尔下来到一个特定的月份,这显然给我正确的重叠,这是因为查询只获得ID的那个月:

SELECT Extract(year FROM company_a_customers.transaction_date) 
     || Extract(month FROM company_a_customers.transaction_date) AS 
     payment_month, 
     Count(UNIQUE(company_a_customers.customer_id)) 
FROM (SELECT * 
     FROM my_table 
     WHERE (merchant_name LIKE '%company_a%') 
       AND transaction_date >= '2017-06-01' 
       AND transaction_date <= '2017-06-30') AS company_a_customers 
     INNER JOIN (SELECT * 
        FROM my_table 
        WHERE (merchant_name = 'company_b') 
          AND transaction_date >= '2017-06-01' 
          AND transaction_date <= '2017-06-30') AS 
        company_b_customers 
       ON company_a_customers.customer_id = 
        company_b_customers.customer_id 
GROUP BY Extract(year FROM company_a_customers.transaction_date) 
      || Extract(month FROM company_a_customers.transaction_date) 

我怎样才能做到这一点的一个查询获得每月在特定月份内与两家公司进行交易的客户总数?

预期结果:输出第二个查询,但对于数据库中的每个月。换句话说:

2017年1月:XX,XXX重叠的客户2017年 2月:XX,XXX重叠的客户2017年 三月:XX,XXX重叠客户

非常感谢。

+0

编辑你的问题。 (1)使用您正在使用的数据库进行标记。 (2)提供样本数据。 (3)提供期望的结果。 –

+0

我已经提出了建议的编辑 –

回答

1

你可以简单地计算出的年/月两种,然后将其添加为加入条件,但这不是很有效,因为它可能会创建一个巨大的中间结果。

如果使用条件汇总与两个商家进行交易,您最好检查每个月/客户。然后按月份计算:

SELECT payment_month, count(*) 
FROM 
( SELECT Extract(year FROM transaction_date) 
      || Extract(month FROM transaction_date) AS payment_month, 
      customer_id 
    FROM my_table 
    WHERE (merchant_name LIKE '%company_a%') 
     OR (merchant_name = 'company_b') 
    GROUP BY payment_month, 
      customer_id 
    -- both merchants within the same months 
    HAVING SUM(CASE WHEN merchant_name LIKE '%company_a%' THEN 1 ELSE 0 END) > 0 
     AND SUM(CASE WHEN merchant_name = 'company_b' THEN 1 ELSE 0 END) > 0 
) AS dt 
GROUP BY 1 

payment_month计算是复杂的(并且没有很好地格式化返回的字符串)。

要获得年/月为字符串:

TO_CHAR(transaction_date, 'YYYYMM') 

自治系统号:

EXTRACT(YEAR FROM transaction_date) * 100 
+ EXTRACT(MONTH FROM transaction_date) 

或计算的第一个月:

TRUNC(transaction_date, 'mon') 
1

只需计算每个客户ID每月的merchant_names数量,您就可以在一个查询中获得所需的结果。使用HAVING> 1会向您显示只有客户与两个交易(或更多,如果有更多的匹配像'%company_a%')。

SELECT 
EXTRACT(Year from transaction_date)||EXTRACT(Month from transaction_date) as payment_month 
,customer_id 
,COUNT(DISTINCT merchant_name) as CompanyCount 
FROM my_table 
WHERE transaction_date >= '2017-06-01' AND transaction_date <= '2017-06-30' 
    AND (merchant_name = 'company_b' or merchant_name LIKE '%company_a%') 
GROUP BY 
    EXTRACT(Year from transaction_date)||EXTRACT(Month from transaction_date) 
,customer_id 
HAVING COUNT(DISTINCT merchant_name) > 1