Пользователь Комментарий Абелисто и другой ответ имеют правильный sql, необходимый для создания гистограммы для нескольких полей в одном запросе.
Единственное редактирование, которое я предложил бы для их усилий, - это добавить предложение ORDER BY
, поскольку из попыток ОП видно, что в верхней части результата нужны более частые метки.Вы можете обнаружить, что сортировка результатов в python, а не в базе данных проще.В этом случае не обращайте внимания на сложность, приведенную к порядку с помощью предложения.
Таким образом, измененный запрос будет:
SELECT category, status, count(*)
FROM stats
WHERE id IN (1, 2)
GROUP BY GROUPING SETS (
(category), (status)
)
ORDER BY
GROUPING(category, status), 3 DESC
Также можно выразить тот же запрос с помощью sqlalchemy.
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()
)
Исследуя выходные данные, мы видим, что он генерирует требуемый запрос ( дополнительные символы новой строки, добавленные в выходные данные для удобочитаемости )
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