Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据某些条件将多个记录合并为一个记录_Sql_Sql Server_Join_Group By - Fatal编程技术网

Sql 根据某些条件将多个记录合并为一个记录

Sql 根据某些条件将多个记录合并为一个记录,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我有下表: payee | payer | amount -----------|-----------|---------- USER3 | USER1 | 150.00 USER3 | USER2 | 50.00 USER1 | USER3 | 300.00 USER2 | USER3 | 300.00 USER3 | USER6 | 100.00 我想合并两个记录,其中

我有下表:

payee      |  payer    |  amount
-----------|-----------|----------
USER3      |  USER1    |  150.00
USER3      |  USER2    |  50.00
USER1      |  USER3    |  300.00
USER2      |  USER3    |  300.00
USER3      |  USER6    |  100.00
我想合并两个记录,其中收款人是第二个记录的付款人,付款人是第二个记录的收款人,并重新计算金额。 因此,我要求的结果是:

payee      |  payer      |  amount
---------- | ------------| ---------
USER1      |  USER3      |  150.00
USER2      |  USER3      |  250.00
USER3      |  USER6      |  100.00
大多数数据库具有最少和最大的功能,因此一种方法是:

select least(payee, payer) as payee, greatest(payee, payer) as payer,
       sum(case when payee = least(payee, payer) then amount else - amount end) as amount
from t
group by least(payee, payer), greatest(payee, payer);
在那些没有的情况下,可以使用大小写表达式

如果始终需要正数,可以使用子查询:

select (case when amount < 0 then payer else payee end) as payee,
       (case when amount < 0 then payee else payer end) as payer,
       abs(amount)
from (select least(payee, payer) as payee, greatest(payee, payer) as payer,
             sum(case when payee = least(payee, payer) then amount else - amount end) as amount
      from t
      group by least(payee, payer), greatest(payee, payer)
     ) t;

用您正在使用的数据库标记您的问题。使用SQL Server 2008获取我创建的用户定义函数的最小值和最大值。它工作得很好。