使用 SQLAlchemy 对单个 table 进行多个 group_by 计数

Multiple group_by counts on single table using SQLAlchemy

我正在使用 SQLAlchemy(1.4/2.0 过渡风格)访问 PostgreSQL 数据库。我正在使用 group_by 来计算按计数排序的唯一名称的数量。然后我需要做的是应用额外的 group_by 来计算相同的事物,但条件不同。例如,如果我有这个用户对象

class User(Base):
    __tablename__ = "user"

    user_id = Column(Integer, primary_key=True)
    name = Column(String)
    city = Column(String)

我可以获得前 100 个最流行的用户名和使用该名称的用户数:

stmt = select(User.name, func.count(User.user_id).label("total")) \
       .group_by(User.name) \
       .order_by(desc('total')) \
       .limit(100)

我需要做的是,对于那 100 个最流行的名字,找出其中有多少个名字的城市 ==“纽约”、“芝加哥”和“洛杉矶”。我想像这样取回数据:

name: "Charles Smith", total:526, NY:28, Chi:17, LA:23

知道怎么做吗?

直接SQL可以在count上使用FILTER子句得到以标准count为总计的个别城市计数:见example here

select  name, total, ny, chi, la 
  from ( select name 
              , count(*) total 
              , COUNT(*) FILTER (WHERE city='Chicago')     chi
              , COUNT(*) FILTER (WHERE city='Los Angeles') la
              , COUNT(*) FILTER (WHERE city='New York')    ny  
           from users 
          group by   name            
       ) sq;

我留给你转换成SQL炼金术;因为我可以阅读它来理解,但我不太愿意尝试编写它。