簡體   English   中英

基於多個條件的聯接表中的MySQL計數

[英]MySQL Count from Joined Table on multiple criteria

這是我的第一篇文章,在此先感謝您的耐心配合,也感謝所有參與Stack的人,我已經用了很多東西來學習! 如果您已經回答過此問題,請原諒,我已盡力尋找替代解決方案。 所以我有兩個表,一個訂單表和一個customer_history表(這是用與這些表相同格式編寫的偽造數據)。

命令

orders_id  customers_id  date_purchased       order_total
12341      12            2016-05-15 00:00:01  24.50
12342      13            2016-06-01 00:00:01  29.99
12343      12            2016-06-01 00:00:01  18.50 

客戶歷史

id  customers_id  created_at           agent_name  contact_type
1   12            2016-05-31 00:00:01  William     Phone Call
2   12            2016-05-29 00:00:01  Kyle        Email
3   13            2016-05-17 00:00:01  William     Phone Call
4   13            2016-05-28 00:00:01  William     Email
5   12            2016-05-11 00:00:01  Kyle        Email
6   12            2016-05-12 00:00:01  Kyle        Email
5   12            2016-05-13 00:00:01  William     Phone Call

我們試圖做的是為訂單建立報告卡,以查看客戶是否在與代理商聯系的7天內下訂單。 所以我想返回的是:

orders_id  customers_id  date_purchased       order_total  agent_name  phone_count  email_count
12341      12            2016-05-15 00:00:01  24.50        Kyle        0            2
12341      12            2016-05-15 00:00:01  24.50        William     1            0
12342      13            2016-06-01 00:00:01  29.99        William     0            1
12343      12            2016-06-01 00:00:01  18.50        William     1            0
12343      12            2016-06-01 00:00:01  18.50        Kyle        0            1

到目前為止,我已經為我的選擇查詢找到了這個,但是它沒有返回我想要的結果:

SELECT 
  oc.orders_id, 
  oc.customers_id, 
  oc.date_purchased, 
  oc.order_total,
  SUM(CASE WHEN (ch.contact_type = "Phone Call" AND ch.created_at <= oc.date_purchased AND ch.created_at > (oc.date_purchased - INTERVAL 7 DAY)) THEN 1 ELSE 0 END) AS phone_count,
  SUM(CASE WHEN (ch.contact_type = "Email" AND ch.created_at <= oc.date_purchased AND ch.created_at > (oc.date_purchased - INTERVAL 7 DAY)) THEN 1 ELSE 0 END) AS email_count
FROM orders oc
LEFT JOIN customers_history ch
ON ch.customers_id = oc.customers_id
WHERE ch.agent_name != NULL

任何幫助是極大的贊賞!

我認為您應該將日期條件移到where子句中(而不是在when中),並使用date_sum和date()格式

SELECT 
  oc.orders_id, 
  oc.customers_id, 
  oc.date_purchased, 
  oc.order_total,
  oc.agent_name
  SUM(CASE WHEN (ch.contact_type = "Phone Call"  THEN 1 ELSE 0 END) AS phone_count,
  SUM(CASE WHEN (ch.contact_type = "Email"  THEN 1 ELSE 0 END) AS email_count
FROM orders oc
LEFT JOIN customers_history ch
ON ch.customers_id = oc.customers_id
WHERE ch.agent_name != NULL
AND date(ch.created_at)  <= date(oc.date_purchased)  
AND ch.created_at > DATE_SUB(oc.date_purchased,INTERVAL 7 DAY)
 SELECT t.orders_id,
   t.customers_id,
   t.date_purchased,
   t.order_total,
   h.agent_name,
   (SELECT Count(1)
    FROM   customers_history h2
    WHERE  h2.contact_type = 'Phone Call'
           AND h2.agent_name = h.agent_name
           AND Date(h2.created_at) <= Date(t.date_purchased)
           AND h2.created_at > Date_sub(t.date_purchased, INTERVAL 7 day))
   AS
   phone_count,
   (SELECT Count(1)
    FROM   customers_history h2
    WHERE  h2.contact_type = 'Email'
           AND h2.agent_name = h.agent_name
           AND Date(h2.created_at) <= Date(t.date_purchased)
           AND h2.created_at > Date_sub(t.date_purchased, INTERVAL 7 day))
   AS email_count
FROM   orders t, customers_history h 
WHERE  h.customers_id = t.customers_id
GROUP  BY t.customers_id  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM