我想从表中获取数据,其中有两个以上(至少 2 个是必须的)值是针对单个客户的,1) 债务 2) 已付债务。我需要根据同一行中每个客户的最大日期显示这两个值。我正在使用下面的查询
查询
SELECT MAX(RECEIPTS.DATENEW) AS DATE,
MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN PAYMENTS.TOTAL END) `TAKEN DEBT`,
MAX(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN PAYMENTS.TOTAL END) `PAID DEBT`,
CUSTOMERS.NAME AS CUSTOMER
FROM RECEIPTS
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID
INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT
INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID
WHERE PAYMENTS.PAYMENT IN('debt', 'debtpaid')
GROUP BY RECEIPTS.ID
返回结果如下,看起来更接近...
但我需要将单个客户的债务和已偿还债务值放在同一行中,并且还需要他们的日期(个人日期)。所需数据如下图所示
最佳答案
好吧,不知怎么的,这奏效了! 需要注意几件事,正如我所说,每个客户都有两个条目,因此必须按 CUSTOMER 分组并对日期应用相同的 CASE 子句,因此只需放置代码以防有人发现它有帮助。
SELECT
MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN PAYMENTS.TOTAL END) AS TAKENDEBT,
MIN(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN PAYMENTS.TOTAL END) AS GIVENDEBT,
MAX(CASE WHEN PAYMENTS.PAYMENT = 'debt' THEN RECEIPTS.DATENEW END) AS TAKENDATE,
MAX(CASE WHEN PAYMENTS.PAYMENT = 'debtpaid' THEN RECEIPTS.DATENEW END) AS GIVENDATE,
CASE WHEN PAYMENTS.PAYMENT = 'debt' OR PAYMENTS.PAYMENT = 'debtpaid' THEN CUSTOMERS.NAME END AS CUSTOMER
FROM RECEIPTS
INNER JOIN TICKETS ON RECEIPTS.ID = TICKETS.ID
INNER JOIN PAYMENTS ON RECEIPTS.ID = PAYMENTS.RECEIPT
INNER JOIN CUSTOMERS ON TICKETS.CUSTOMER = CUSTOMERS.ID
WHERE
(PAYMENTS.PAYMENT = 'debt'
OR PAYMENTS.PAYMENT = 'debtpaid')
GROUP BY CUSTOMER
ORDER BY CUSTOMER
感谢您的所有建议!
关于mysql - 从两个不同的行中为单个名称选择两个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20441435/