<p>用户<a href="https://stackoverflow.com/users/593144/abelisto">Abelisto</a>的注释和另一个答案都具有在一个查询中为多个字段生成直方图所需的正确sql。你知道吗</p>
<p>对于他们的努力,我建议的唯一编辑是添加一个<code>ORDER BY</code>子句,因为从OP的尝试来看,在结果的顶部需要更频繁的标签。您可能会发现,用python排序结果比在数据库中排序更简单。在这种情况下,忽略order by子句带来的复杂性。你知道吗</p>
<p>因此,修改后的查询将是:</p>
<pre><code>SELECT category, status, count(*)
FROM stats
WHERE id IN (1, 2)
GROUP BY GROUPING SETS (
(category), (status)
)
ORDER BY
GROUPING(category, status), 3 DESC
</code></pre>
<p>也可以使用sqlalchemy表示相同的查询。你知道吗</p>
<pre><code>from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Stats(Base):
__tablename__ = 'stats'
id = Column(Integer, primary_key=True)
category = Column(Text)
status = Column(Text)
stmt = select(
[Stats.category, Stats.status, func.count(1)]
).where(
Stats.id.in_([1, 2])
).group_by(
func.grouping_sets(tuple_(Stats.category),
tuple_(Stats.status))
).order_by(
func.grouping(Stats.category, Stats.status),
func.count(1).desc()
)
</code></pre>
<p>通过研究输出,我们可以看到它生成了所需的查询(<em>为易读性在输出中添加了额外的换行符</em>)</p>
<pre><code>print(stmt.compile(compile_kwargs={'literal_binds': True}))
# outputs:
SELECT stats.category, stats.status, count(1) AS count_1
FROM stats
WHERE stats.id IN (1, 2)
GROUP BY GROUPING SETS((stats.category), (stats.status))
ORDER BY grouping(stats.category, stats.status), count(1) DESC
</code></pre>