如何通过不同的条件两次加入同一个表来获得正确的" group by"结果

时间:2017-11-12 10:49:21

标签: 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;

它找不到。如果此人有两个帐户,则会为帐户返回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;

但是此查询为帐户返回4而不是2。 如何解决此问题?

2 个答案:

答案 0 :(得分:4)

您的查询生成笛卡尔积,每个帐户都与其他帐户一起

您需要一次加入:

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;

答案 1 :(得分:1)

你可以用它。我假设state ='0'表示活动。

SELECT p.id, COUNT(a.id) accounts, SUM(CASE WHEN a.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;
相关问题