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)
。如果优化器错过了这一点,您可以将逻辑拆分为两个子查询。
我有两个 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)
。如果优化器错过了这一点,您可以将逻辑拆分为两个子查询。