与鲍勃和约翰的SQL相互欠钱

时间:2016-02-01 16:12:15

标签: sql

我在文件中有以下3个字段:person_ows person_is_owed amount

示例内容:

Bob      John     100
John     Bob      110

SQL产生的结果是什么:

Bob    John    100    110
John   Bob     110    100

很抱歉,如果这是一个微不足道的问题,但我只是想学习SQL,我觉得它真的很像HELL!

2 个答案:

答案 0 :(得分:0)

所以,你需要的是能够JOIN两行。在这种情况下,您可能希望OUTER JOIN假设每个都不匹配另一个匹配。现在,您只需要提出JOIN条件,在这种情况下,这些条件将基于名称(person_owesperson_is_owed):

SELECT
    T1.person_owes,
    T1.person_is_owed,
    T1.amount AS owes_amount,
    COALESCE(T2.amount, 0) AS is_owed_amount
FROM
    My_Table T1
LEFT OUTER JOIN My_Table T2 ON T2.person_is_owed = T1.person_owes

COALESCE只是为了确保在没有匹配时您得到的值为0而不是NULL

此外,这假设只有person_owesperson_is_owed的每个组合中的一个。如果你可能有两行显示约翰欠了比尔两个不同数额的钱,那么你将不得不调整上面的SQL,它会有点复杂。

如果您打算多使用SQL,那么您应该花时间阅读一本(或更好)更多关于该主题的书。

答案 1 :(得分:0)

假设(person_ows, person_is_owed)的组合是唯一的

select person_ows,
       person_is_owed,
       amount, 
       (select t2.amount 
        from the_table t2
        where (t2.person_ows, t2.person_is_owed) = (t1.person_is_owed, t1.person_ows)) 
from the_table t1