2017-07-14 102 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