ELECT list is not in GROUP BY clause and contains nonaggregated column
时间: 2023-11-15 12:57:27 浏览: 92
这个错误是在使用MySQL数据库时出现的常见错误之一。它的意思是在GROUP BY子句中未命名的非聚合列,也不在功能上依赖于它们。简单来说,就是在SELECT语句中选择了一些列,但是这些列没有在GROUP BY子句中出现,也没有被聚合函数包含。这个错误通常是由于MySQL的ONLY_FULL_GROUP_BY模式引起的,这个模式要求所有的非聚合列都必须在GROUP BY子句中出现。解决这个问题的方法是要么将所有的非聚合列都包含在GROUP BY子句中,要么使用聚合函数对这些列进行聚合。如果你不想使用ONLY_FULL_GROUP_BY模式,可以将它禁用掉。你可以通过查询数据库的版本信息来确定是否启用了ONLY_FULL_GROUP_BY模式。
相关问题
将下面SQL语句通过sqlalchemy转换成orm语句实现:ELECT j.element, count(distinct b.requisition_no) as cnt FROM dws_v2_test.dws_biz_detail b JOIN dws_v2_test.dws_test_result p ON b.requisition_no=p.requisition_no JOIN JSON_TABLE(p.biok_category, '$[*]' columns (element varchar(50) path '$')) j WHERE b.tech_platform=:tech_platform AND b.prod_id=:prod_id and b.biz_type=:biz_type and b.report_status like '报告%' and b.report_result=:report_result and b.serv_id in :service_ids and j.element <> '' GROUP BY j.element;
假设你已经创建了SQLAlchemy的session对象,并且已经定义了对应的ORM模型类,可以使用如下代码实现上述SQL查询的ORM语句:
```python
from sqlalchemy import func
from sqlalchemy.orm import aliased
from models import BizDetail, TestResult
# 别名定义
j = aliased(func.json_table(TestResult.biok_category, '$[*]'), name='j')
b = aliased(BizDetail, name='b')
# ORM查询语句
query = session.query(j.element, func.count(func.distinct(b.requisition_no)).label('cnt'))
query = query.join(TestResult, TestResult.requisition_no == b.requisition_no)
query = query.join(j, j.columns.element != '')
query = query.filter(b.tech_platform == :tech_platform, b.prod_id == :prod_id, b.biz_type == :biz_type,
b.report_status.like('报告%'), b.report_result == :report_result,
b.serv_id.in_(service_ids))
query = query.group_by(j.element)
# 获取查询结果
result = query.all()
```
其中,`models`是你定义的ORM模型类文件,包括`BizDetail`和`TestResult`两个类,分别对应数据库中的`dws_biz_detail`和`dws_test_result`表。需要注意的是,`json_table`函数需要通过`func`对象引入,而`alias`函数则需要通过`orm`对象的`aliased`方法引入,并且需要指定别名。ORM查询语句的写法与SQL语句类似,但是需要使用ORM模型类的属性替代表名和字段名。最后使用`all()`方法获取查询结果。
elect t1.pro_c_id from ( ( select pro_c_id, count(distinct(pro_pif_id)) as cnt1 from property, finances_product where pro_pif_id = p_id and pro_type = 1 group by pro_c_id ) as t1 join ( select pro_c_id, count(distinct(pro_pif_id)) as cnt2 from property, fund where pro_pif_id = f_id and pro_type = 3 group by pro_c_id ) as t2 on t1.pro_c_id = t2.pro_c_id ) where t1.cnt1 > t2.cnt2
这也是一条 SQL 查询语句,它的功能是查询出满足以下条件的商品属性:
1. 属性类型为 1 或 3
2. 属性所属的产品信息分别与 finances_product 表和 fund 表中的记录关联
3. 统计每个商品的不同产品信息数量(对于 pro_type = 1 的属性,统计 pro_pif_id 的个数;对于 pro_type = 3 的属性,统计 f_id 的个数)
4. 比较每个商品在不同类型的产品信息数量,只返回 pro_type = 1 的商品且其对应的 pro_pif_id 数量大于 pro_type = 3 的 f_id 数量。
查询结果是 pro_c_id 列的值。
阅读全文