首页 > 解决方案 > 根据连接表的另一列双重计算一列

问题描述

这在标题中很难解释,但我有一个列是一个连接表,我想根据书本来计算一个角色出现过type的书本数。

所以如果cb.type = 2,那么我想要count(cb.id) + 1这是否有意义。否则,对于所有其他类型,只需正常计数即可count(cb.id)

  SELECT
   CASE
     WHEN cb.type = 2 THEN count(cb.id) + 1
     ELSE count(cb.id)
   END AS book_count,
   c.*
  FROM characters c
         INNER JOIN character_books cb ON cb.character_id = c.id
  GROUP BY c.id, cb.type
  ORDER BY book_count DESC

上面的查询不起作用,因为我必须分组c.id, cb.type,所以我没有得到该角色出现的书籍总数。

现在不考虑cb.type,查询将如下所示:

  SELECT count(cb.id) AS book_count, c.*
  FROM characters c
         INNER JOIN character_books cb ON cb.character_id = c.id
  GROUP BY c.id
  ORDER BY book_count DESC

但是,如果该列cb.type = 2(实际上是按位列,只是2为了简单起见在这里使用数字),那么我们应该在book_count.

我将如何做到这一点?

标签: sqlpostgresql

解决方案


您需要条件聚合。我想你想要:

SELECT c.id, 
       SUM(CASE cb.type = 2 THEN 2 ELSE 1 END) as book_count
FROM characters c INNER JOIN
     character_books cb
     ON cb.character_id = c.id
GROUP BY c.id
ORDER BY book_count DESC;

推荐阅读