Мне интересно, могу ли я выбрать select () для sub_query.Я могу сделать присоединиться к sub_query с любым peewee.Model.Но когда я написал подзапрос и хотел просто сгруппировать с одним из столбцов,
e.g. sub_query.select(sub_query.c.column_1, fn.COUNT(sub_query.c.column2)alias('col2_count')).group_by(sub_query.c.column_1)
запрос не был вложенным и выдавал ошибку синтаксиса SQL.
(Не могу раскрыть код) (Я сделал псевдоним () для sub_query)
Редактировать
Пример:
class Product(Model):
id = PrimaryKeyField()
name = CharField()
created_date = DateField()
class Part(Model):
id = PrimaryKeyField()
product = ForeignKeyField(Product)
name = CharField()
class ProductError(Model):
id = PrimaryKeyField()
product = ForeignKeyField(Product)
note = CharField()
class PartError(Model):
id = PrimaryKeyField()
part = ForeignKeyField(Part)
error = ForeignKeyField(ErrorMaster)
Здесь Productможет иметь общую ошибку, а детали могут иметь конкретную ошибку, которая предопределена в ErrorMaster
Я просто хочу узнать количество продуктов, которые имеют ошибки по сравнению с общей датой продуктов.(ошибка - это ошибка продукта или ошибка в любой части)
Так что sub_query - это что-то вроде
sub_q = Product.select(
Product.created_date,
Product.id.alias('product_id'),
fn.IF(# checks if product has error
ProductError.is_null(True), if no product error check part error
fn.IF(fn.COUNT(PartError.id) == 0, 0, 1), # checks if error count > 0 then there is error in part
1
).alias('is_error')
).join(Part, on=Product.id == Part.product)
.join(ProductError, JOIN_LEFT_OUTER, on=Product.id == ProductError.product)
.join(PartError, JOIN_LEFT_OUTER, on=PartError.part == Part.id)
.where(Product.created_date.between(from_date, to_date))
.group_by(Product.id).alias('some_alias')
# below does not work but I can do this in sql
query = sub_q.select(sub_q.c.created_date,
fn.COUNT(sub_q.c.product_id).alias('total_products'),
fn.SUM(sub_q.c.is_error).alias('product_with_errors'))
.group_by(sub_q.c.created_date)