postgreSQL 添加行的值,如果列被切换



在连接同一个表后,我得到的结果如下:

c1   c2  count
A    B   5
A    C   4
B    A   2
B    C   2
C    A   1

现在,如果切换c1c2,则应添加数字,如下所示:

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;

最新更新