mysql - 从 2 个表中以及指定日期之间选择最新日期

标签 mysql sql

我有一个查询,其中我获取特定日期范围内的记录的总和。现在我尝试在每个日期范围内包含一列的最新日期。

SQL fiddle :

http://sqlfiddle.com/#!9/2b486/6

查询:

SELECT
Contract.contract_length,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-01-01 00:00:00' AND '2013-03-31 23:59:59'
  THEN 1 ELSE 0 END
) as rental_count_Q1_2013,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-01-01 00:00:00' AND '2013-03-31 23:59:59'
    AND termination_date BETWEEN '2013-01-01 00:00:00' AND NOW()
  THEN 1 ELSE 0 END
) as terminated_count_Q1_2013,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-01-01 00:00:00' AND '2013-03-31 23:59:59'
    AND(
      Data1Payout.payout_date BETWEEN '2013-01-01 00:00:00' AND NOW()
      OR Data2Payout.payout_date BETWEEN '2013-01-01 00:00:00' AND NOW()
    )
  THEN 1 ELSE 0 END
) as customer_payouts_Q1_2013,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-04-01 00:00:00' AND '2013-06-30 23:59:59'
  THEN 1 ELSE 0 END
) as rental_count_Q2_2013,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-04-01 00:00:00' AND '2013-06-30 23:59:59'
    AND termination_date BETWEEN '2013-04-01 00:00:00' AND NOW()
  THEN 1 ELSE 0 END
) as terminated_count_Q2_2013,
SUM(
  CASE WHEN
    Contract.created BETWEEN '2013-04-01 00:00:00' AND '2013-06-30 23:59:59'
    AND(
      Data1Payout.payout_date BETWEEN '2013-04-01 00:00:00' AND NOW()
      OR Data2Payout.payout_date BETWEEN '2013-04-01 00:00:00' AND NOW()
    )
  THEN 1 ELSE 0 END
) as customer_payouts_Q2_2013

FROM contracts AS Contract
LEFT OUTER JOIN (
  SELECT id, customer_id, payments_made, termination_date FROM terminations
) AS Termination on Termination.customer_id = Contract.customer_id
LEFT OUTER JOIN (
  SELECT id, customer_id, payout_date FROM datasource_1_payouts
) AS Data1Payout on Data1Payout.customer_id = Contract.customer_id
LEFT OUTER JOIN (
  SELECT id, customer_id, payout_date FROM datasource_2_payouts
) AS Data2Payout on Data2Payout.customer_id = Contract.customer_id
GROUP BY Contract.contract_length

这将返回每个季度的租金、这些租金的终止以及这些租金的支付计数,并按契约(Contract)期限进行分组。

contract_length | rental_count_Q1_2013 | terminated_count_Q1_2013 | customer_payouts_Q1_2013 | rental_count_Q2_2013 | terminated_count_Q2_2013 | customer_payouts_Q2_2013
24              |           2          |           1              |           1              |           1          |           0              |           1
36              |           2          |           1              |           1              |           2          |           0              |           2
48              |           1          |           1              |           0              |           2          |           1              |           1

我还需要获取每个季度的最后付款日期。 IE。上次付款日期是根据 2013 年第一季度创建的契约(Contract)进行的。付款也存储在 2 个单独的表中。

我尝试过的:

使用 MAX():

CASE WHEN
    Contract.created BETWEEN '2013-01-01 00:00:00' AND '2013-03-31 23:59:59'
    AND Data1Payout.payout_date BETWEEN '2013-04-01 00:00:00' AND NOW()
    AND MAX(Data1Payout.payout_date) > MAX(Data2Payout.payout_date)
    THEN MAX(Data1Payout.payout_date) ELSE MAX(Data2Payout.payout_date) END
as last_payout_date_Q1_2013

这不起作用,因为所有支付日期都包含在每个结果中,因此 MAX() 始终是最新的总体结果。

工作解决方案:

MAX(
    CASE WHEN Contract.created BETWEEN '2013-01-01 00:00:00' AND '2013-03-31 23:59:59'
    THEN GREATEST(IFNULL(Data1Payout.payout_date, '0000-00-00'), IFNULL(Data2Payout.payout_date, '0000-00-00'))
    ELSE NULL END
) AS last_payout_date_Q1_2013

最佳答案

您将 MAX 函数放在错误的位置。实际上,它与其他CASE语句相同。
由于您的查询太长,我将做一个简单的解释,希望对您有所帮助。

SELECT 
    SUM(
    CASE WHEN x = 'yes'
    THEN 1 ELSE 0
    END) AS SUM_NUMBER, --terminated_count_Q1_2013 for example
    MAX(
    CASE WHEN x = 'yes'
    THEN yourdatecolumn
    ELSE NULL END) AS MAX_DATE --last_payout_date_Q1_2013 for example
FROM yourtable

我希望您知道如何在您自己的查询中实现此功能。

关于mysql - 从 2 个表中以及指定日期之间选择最新日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33035846/

相关文章:

mysql - SQL 查询错误在需要条件的内容中指定的非 bool 类型的表达式

受 TTL 约束的 MySQL 记录

php - laravel一对多记录插入和更新解决方案

php - Angularjs如何获取服务中$http响应返回的Json格式的解析数据

php - 是否合并或拆分表

sql - 用最后的结果填表

php - 如何从 Mysql 计算数字

mysql - SQL - 获取不同的值及其在组中出现的频率计数

sql - "to_char()"在 PostgreSQL 中是否比 "BETWEEN"使用更多的 CPU

sql - 如何避免在 SQL View 中使用 getdate()?