SQL - 比较同一列中的日期

时间:2014-06-23 03:58:14

标签: mysql sql

我试图为老化交易制作一个列表,其中列表将包含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

更新:它实际上是在信用卡之前以借方开始

3 个答案:

答案 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

未经过测试。