我有一个查询,其中我获取特定日期范围内的记录的总和。现在我尝试在每个日期范围内包含一列的最新日期。
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/