使用sql从交易详细信息中获取信用和借记

时间:2018-05-25 13:58:53

标签: sql

我有像

这样的表结构
From | To | Amount Transacted | Debited | Credited
A    | B  | 300               |100      | 200
C    | D  | 250               |250      | 0

最后一栏定义了现金流的方向 我想把输出作为

select DISTINCT r.to,r.to,r.Amt,r.In_out
,sum(r.Amt) as credited 
from 
    Records as r 
join 
    Records as s 
    on 
    (r.from <> s.from and r.to == s.from)
where 
    r.from <>s.from 

--GROUP by r.from

我尝试了各种查询,例如

{{1}}

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

在许多数据库中,您可以使用least()greatest()

select least(from, to), greatest(from, to),
       sum(amount),
       sum(case when in_out = 0 and from = least(from, to) or
                     in_out = 1 and to = least(from, to) 
                then amount else 0
           end) as debited,
       sum(case when in_out = 0 and to = least(from, to) or
                     in_out = 1 and from = least(from, to) 
                then amount else 0
           end) as credited
from records
group by least(from, to), greatest(from, to);

如果您的数据库不支持这些功能,您可以使用case表达式来完成同样的事情。

答案 1 :(得分:2)

您想要greatest() / least()

select least(from, to) from, greatest(from, to) to,
       sum(amt) AmountTransacted,
       sum(case when In_out = 0 then Amt else 0 end) Debited,
       sum(case when In_out = 1 then Amt else 0 end) Credited
from table t
group by least(from, to), greatest(from, to);

答案 2 :(得分:1)

不确定您的RDBMS:Oracle还是SQLite。

无论如何,这是在标准SQL

中实现这一目标的一种方法

诀窍是在UNION查询中,如果In_out为1,则反转From和To列,以便正确地对帐户组进行分组

SELECT u.From, u.To, SUM(Amt) AS "Amount Transacted",
            SUM(CASE WHEN In_out=0 THEN Amt ELSE 0 END) AS Debited,
            SUM(CASE WHEN In_out=1 THEN Amt ELSE 0 END) AS Credited
FROM
(
    SELECT In_out, From, To, Amt FROM Records WHERE In_Out = 0
    UNION ALL
    SELECT In_out, To, From, Amt FROM Records WHERE In_Out = 1
) u
GROUP BY u.From, u.To