在连接同一个表后,我得到的结果如下:
c1 c2 count
A B 5
A C 4
B A 2
B C 2
C A 1
现在,如果切换c1
和c2
,则应添加数字,如下所示:
c1 c2 count
A B 7
A C 5
B C 2
如何使用查询完成此操作?
使用left join
在反向位置上自连接表,并返回c1
小于 c2
或没有匹配行的表。使用coalesce
在左侧连接count
null
时添加0
。
select
t.c1
, t.c2
, t.count + coalesce(s.count,0) as count
from t
left join t as s
on t.c1 = s.c2
and t.c2 = s.c1
where t.c1 < t.c2 or s.c1 is null
SQL Server中的Rextester演示:http://rextester.com/VBQI62112
返回:
+----+----+-------+
| c1 | c2 | count |
+----+----+-------+
| A | B | 7 |
| A | C | 5 |
| B | C | 2 |
+----+----+-------+
许多数据库都支持least()
和greatest()
。 如果它们可用,您可以执行以下操作:
select least(c1, c2) as c1, greatest(c1, c2) as c2, sum(count) as cnt
from (<your query here>) t
group by least(c1, c2), greatest(c1, c2);
在不支持这些功能的数据库中,可以使用case
。
注意:如果NULL
任何一列,则least()
和greatest()
的语义返回NULL
,因此您可能需要小心是否可以NULL
任何值。
输出 c1,c2 与相同的 c2,c1 连接起来?
select t1.c1
,t1.c2
,sum(coalesce(t1.count,0), coalesce(t2.count,0))
from table t1
left join table t2
on t1.c1 = t2.c2
and t1.c2 = t2.c1
group by t1.c1, t1.c2
having t1.c1 < t1.c2
SELECT t.c1
, t.c2
, t.cnt + CASE WHEN s.cnt IS NULL THEN 0 ELSE s.cnt END as cnt
FROM t
LEFT JOIN
t as s
ON t.c1 = s.c2
AND t.c2 = s.c1
WHERE t.c1 < t.c2;