mysql - 从两个不同的行中为单个名称选择两个值

标签 mysql

我想从表中获取数据,其中有两个以上(至少 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

返回结果如下,看起来更接近...

enter image description here

但我需要将单个客户的债务和已偿还债务值放在同一行中,并且还需要他们的日期(个人日期)。所需数据如下图所示

enter image description here

最佳答案

好吧,不知怎么的,这奏效了! 需要注意几件事,正如我所说,每个客户都有两个条目,因此必须按 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/

相关文章:

php - 无法使用 PDO 从 MySQL 中获取多行

php - MySQL导入Excel工作表的奇怪问题

java - 检索数据库结果

php - Mysql_num_rows() 问题

mysql - PHP/MySQL 多对多。如何?

PHP fatal error : call to undefined function mysql_connect()

php - 如何将出生日期转换为年龄并将其保存到表格中?

mysql - 使用 INNER JOIN 显示所有记录

php - 从具有重复值的 MySQL 结果创建多维嵌套数组 (PHP)

MySQL::Edge Case::混合类型外键::可能还是做梦?