如何通过不同条件左连接同一个表两次以获得正确的“分组依据”结果

Kir*_*ill 1 sql group-by left-join

我有一个按人返回帐户计数的查询

SELECT p.id, COUNT(a.id) accounts
FROM Person p
  LEFT JOIN Account a
  ON a.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

它可以找到。如果该人有两个帐户,则返回 2。但我还需要获得活跃帐户数。我尝试这样做:

SELECT p.id, COUNT(a.id) accounts, COUNT(a1.id) active_accounts
FROM Person p
  LEFT JOIN Account a
  ON a.person_id = p.id
  LEFT JOIN Account a1
  ON a1.person_id = p.id AND a1.state = '0'
WHERE p.id = 1
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

但此查询返回帐户 4,而不是 2。我该如何修复此查询?

Ind*_*ent 5

您的查询产生笛卡尔积,每个帐户都与其他帐户连接

您需要一个连接:

SELECT
   p.id,
   COUNT(a.id) total_accounts,
   sum(case when a1.state = '0' then 0 else 1 end) inactive_accounts,
   sum(case when a1.state = '0' then 1 else 0 end) active_accounts
FROM Person p
  LEFT JOIN Account a
  ON a.person_id = p.id
WHERE p.id = 1
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)