0

例如。 当前表的

我有一个表,其中包含一个描述调用的表。因此,有一to列和一from列。问题是我想要每个号码发送的总消息,可以是fromto。有关视觉效果,请参阅上表。

我希望决赛桌是显示 A : 3 、 B: 2 、 C:1 和 D:1 的东西。

你如何计算 2 列中的数字并将它们相加?

4

2 回答 2

0

您可以取消透视数据并聚合:

select person, count(*) as num_calls
from ((select from as person from t) union all
      (select to as person from t
     ) c
group by person;

请注意,fromandto是非常非常糟糕的列名称,因为它们是 SQL 关键字。我没有在查询中对它们进行转义,因为这只会使查询变得混乱,而且我认为真正的列有更好的名称。

于 2019-09-10T22:35:12.980 回答
0

一种解决方案是先进行UNION ALL两个聚合查询,以收集两个不同列中每个值的出现次数,然后将结果汇总到外部查询中,例如:

SELECT val, SUM(cnt) cnt
FROM (
    SELECT `from` val, COUNT(*) cnt FROM mytable GROUP BY `from`
    UNION ALL
    SELECT `to`, COUNT(*) FROM mytable GROUP BY `to`
) x
GROUP BY val

DB Fiddle上的这个演示与您的示例数据返回:

| val | cnt |
| --- | --- |
| A   | 3   |
| B   | 2   |
| C   | 1   |
| D   | 1   |
| E   | 1   |
于 2019-09-10T22:42:20.953 回答