首页 > 解决方案 > SQL 计算每个用户的有效事务

问题描述

我需要获取在两个日期之间进行特定数量的有效交易的客户列表。

SELECT
  customer.customer_id,
  COUNT(
    CASE WHEN transaction.transaction_date>="2010-01-01" 
      THEN 1 
    ELSE NULL 
    END
  ) AS Total
FROM customer
LEFT JOIN transaction ON customer.customer_id = transaction.customer_id
GROUP BY customer.customer_id
HAVING (Total>=min_transactions AND Total<=max_transactions)

这不会返回任何东西。通过删除 COUNT(..) 中的 CASE,它返回每个用户的交易量,但它也包含无效和超出范围的交易。

CASE 循环不应该像在 COUNT 中那样工作吗?

只计算事务而不合并两个表是一个更好的主意吗?

(使用 MySQL)

标签: mysqlsql

解决方案


我认为这是您想要的查询:

SELECT c.customer_id, COUNT(t.customer_id) as Total
FROM customer c LEFT JOIN
     transaction t
     ON c.customer_id = t.customer_id AND
        t.transaction_date >= '2010-01-01'
GROUP BY c.customer_id
HAVING Total >= min_transactions AND Total <= max_transactions;

笔记:

  • a 中第二个表的条件LEFT JOIN通常属于ON子句。
  • 对日期和字符串常量使用单引号。双引号可用于转义标识符。
  • count()是从第二张表开始计算的。如果没有匹配项,则计数为0
  • LEFT JOIN仅当min_transactionsis ever0时才需要A。

推荐阅读