【问题标题】:MySQL Count from Joined Table on multiple criteria多个条件下的连接表中的 MySQL 计数
【发布时间】:2016-06-01 16:04:19
【问题描述】:

这是我的第一篇文章,提前感谢您的耐心等待,并感谢大家参与 Stack,我已经用它来学习了!如果之前回答过这个问题,请原谅,我已尽力寻找替代解决方案。所以我有两个表,一个 orders 表和一个 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 

customers_history

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

非常感谢任何帮助!

【问题讨论】:

    标签: mysql join criteria


    【解决方案1】:

    我认为您应该在 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)
    

    【讨论】:

      【解决方案2】:
       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  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多