我试图为老化交易制作一个列表,其中列表将包含0-30天列和31-60天列。
如果交易日期在30天内,则在0-30天内,如果它在31-60范围内,那么它在31-60天内。
所以为了更清楚,这里是表
|trans_code |customer |trans_date | credit| debit |
|ABC1000 |John ptd |2014-05-20 | 0.00 | 200.00 |
|ABC1000 |John ptd |2014-07-06 |200.00 | 0.00 |
|ABC1001 |Petron |2014-04-25 | 0.00 | 600.00 |
|ABC1001 |Petron |2014-06-10 |600.00 | 0.00 |
John ptd在2014-05-20的债务为200美元,他在2014-07-06支付了债务。所以日期范围在31-60天之内。他支付的200美元将在Aging Transaction列表中进入31-60天列(如下所示)。
|Customer | 0-30 days | 31-60 days|
|John ptd | 0.00 | 200.00|
|Petron | 0.00 | 600.00|
现在我的问题是如何比较trans_date,因为它使用SQL在同一列中。它应该基于 trans_code 。
更新:它实际上是在信用卡之前以借方开始
答案 0 :(得分:1)
SELECT
t.customer,
SUM(c1.credit) AS `0-30`,
SUM(c2.credit) AS `31-60`,
FROM table AS t
LEFT JOIN table AS c1 ON c1.debit = t.credit AND DATEDIFF(t.trans_date, c1.trans_date) <= 30
LEFT JOIN table AS c2 ON c2.debit = c2.credit AND DATEDIFF(t.trans_date, c2.trans_date) > 30 DATEDIFF(t.trans_date, c2.trans_date) <= 60
查看DATEDIFF功能。您加入30天内支付的交易和31-60天内支付的交易。
答案 1 :(得分:1)
这是一种更好的方法:
SELECT
d.customer,
CASE WHEN DATEDIFF(c.trans_date, d.trans_date) <= 30 THEN d.debit ELSE 0.0 END AS `0-30`,
CASE WHEN DATEDIFF(c.trans_date, d.trans_date) > 30 AND DATEDIFF(c.trans_date, d.trans_date) <= 60
THEN d.debit ELSE 0.0 END AS `31-60`
FROM table AS d
INNER JOIN table AS c ON c.trans_code = d.trans_code and c.customer = d.customer
WHERE d.credit = 0.0 and c.debit = 0.0
答案 2 :(得分:0)
您可以使用GROUP_CONCAT。它看起来像
SELECT trans_code ,customer, GROUP_CONCAT(trans_date), credit, debit, 0-30 days
, 31-60 days
FROM table1 INNER JOIN table2 ON table1.customer = table2.customer
WHERE customer = "John ptd" GROUP BY trans_code
未经过测试。