SQL 如何计算每个客户的会议次数?

SQL How can I count the number of meetings for each client?

我有两个 table 会议和客户端。我有两个外键在会tableid_client1和id_client2。如何计算客户之间发生的会议次数?

我有这样的疑问

SELECT client.id_client, count(meet.id_client1)count_meeting
FROM meet JOIN client ON meet.id_client1=client.id_client
GROUP BY  client.id_client;

但是这个查询只计算会见client1。我可以做些什么来计算两个客户的会议次数?

我想要这样的结果

id_client       count_meeting
  1                   3
  2                   1
  3                   2

没有表格我无法测试这个(我也没有 oracle)但希望这至少能给你一些想法。

WITH clientone AS (
    SELECT id_client1, COUNT(id_client1) AS meetings1
    FROM meet
    GROUP BY id_client1),
clienttwo AS (
    SELECT id_client2, COUNT(id_client2) AS meetings2
    FROM meet
    GROUP BY id_client2)
SELECT id_client1, id_client2, (meetings1 + meetings2) AS meetings
FROM clientone OUTER JOIN clienttwo
ON id_client1 = id_client2;

您可能需要一组客户的联合:

SELECT id_client, COUNT(*)
FROM
(
  SELECT id_client1 AS id_client FROM meet
  UNION ALL
  SELECT id_client2 AS id_client FROM meet
) participants
GROUP BY id_client
ORDER BY id_client;

如果您想包括未参加任何会议的客户:

SELECT c.id_client, COUNT(p.id_client)
FROM client c
LEFT JOIN
(
  SELECT id_client1 AS id_client FROM meet
  UNION ALL
  SELECT id_client2 AS id_client FROM meet
) p ON p.id_client = c.id_client
GROUP BY c.id_client
ORDER BY c.id_client;

您也可以为此使用横向连接:

SELECT mc.id_client, COUNT(*) as count_meeting
FROM meet m CROSS JOIN LATERAL
     (SELECT m.id_client_1 as id_client FROM DUAL UNION ALL
      SELECT m.id_client_2 FROM DUAL
     ) mc
GROUP BY mc.id_client;

横向连接的优点是它只扫描 table 一次。另一种可能快速的方法是使用子查询:

select c.*,
       (select count(*)
        from meet m
        where c.id_client in (m.id_client_1, m.id_client_2)
       ) as count_meeting
from clients c;

Oracle 有一个很好的优化器。它应该能够为此使用两个索引:meet(id_client_1)meet(id_client_2)。如果优化器错过了这一点,您可以将逻辑拆分为两个子查询。