我有一个表,其中包含一个描述调用的表。因此,有一to
列和一from
列。问题是我想要每个号码发送的总消息,可以是from
或to
。有关视觉效果,请参阅上表。
我希望决赛桌是显示 A : 3 、 B: 2 、 C:1 和 D:1 的东西。
你如何计算 2 列中的数字并将它们相加?
我有一个表,其中包含一个描述调用的表。因此,有一to
列和一from
列。问题是我想要每个号码发送的总消息,可以是from
或to
。有关视觉效果,请参阅上表。
我希望决赛桌是显示 A : 3 、 B: 2 、 C:1 和 D:1 的东西。
你如何计算 2 列中的数字并将它们相加?
您可以取消透视数据并聚合:
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;
请注意,from
andto
是非常非常糟糕的列名称,因为它们是 SQL 关键字。我没有在查询中对它们进行转义,因为这只会使查询变得混乱,而且我认为真正的列有更好的名称。
一种解决方案是先进行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 |