我有像
这样的表结构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}}
任何人都可以帮助我吗?
答案 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