我试图解决一个看起来像下面写的代码的问题,但是由于缺乏知识和通过sqlalchemy文档阅读,我真的找不到任何有关如何解决我的问题的解决方案。
目标: 如果year_column中的年份相同,则获取sales_in_usd的总和值
到目前为止,我通过使用以下查询调试并通过stackoverflow和文档读取了一些内容,谷歌:
session.query(fact_corporate_sales, Company, Sales,
Time, Sector, func.sum(Sales.sales_in_usd).label('summary')).\
join(Sales).\
join(Time).\
join(Company).\
join(Segment).\
order_by(Time.year.desc()).\
filter(Company.company_name.like(filtered)).\
group_by(fact_corporate_sales.fact_cps_id, Company.company_name,fact_corporate_sales.cps_id).\
all()
而且fact_cps_id在fact_table中是唯一的,同一个表存储,维度表的键也是如此。
我有一个事实表,它存储4个维度表中的4个外键。
fact_cps_id company_id sales_id time_id sector_id
1 4 2 1 2
2 4 1 1 3
3 4 3 2 1
4 4 2 2 4
5 4 4 3 2
6 4 99 1 1
dim_company
company_id company_name
1 Nike
2 Adidas
3 Puma
4 Reebok
dim_segment
segment_id segment_nom
1 basketball
2 running
3 soccer
4 watersports
dim_time
time_id quarter year
1 1 2013
2 2 2013
3 1 2014
4 3 2014
dim_sales
sales_id sales_in_euro
1 2000
2 3200
3 1400
4 1590
.. ..
99 1931
所以基本上,正如你在表格中看到的那样,查询我要做的是从同一年的dim_Time.year< - 中总结所有销售额。
如果我们查看一下我们可以看到的fact_table,我们在这里有三次time_id = 1。因此,这些值可以总结并显示为摘要。
我从标准SQL中知道可以使用group by和aggregate function sum。
我的结果(time_id仅用于帮助,因此没有输出):
13132.0 <- time_id = 1
21201.0 <- time_id = 2
23923.0 <- time_id = 1
31232.0 <- time_id = 99
32021.0 <- time_id = 2
32342.0 <- time_id = 1
131231.0 <- time_id = 4
我将实际查询打印到控制台并得到了[必须删除.all(),因为'list'没有名为'statement'的属性]:
SELECT fact_corporate_sales.cps_fact_id, fact_corporate_sales.cps_id,
fact_corporate_sales.company_id, fact_corporate_sales.time_id, fact_corporate_sales.segment_id, sum(dim_corporate_sales.sales_in_usd) AS summary
FROM fact_corporate_sales INNER JOIN dim_corporate_sales ON dim_corporate_sales.cps_id = fact_corporate_sales.cps_id INNER JOIN dim_time ON dim_time.time_id = fact_corporate_sales.time_id INNER JOIN dim_company ON dim_company.company_id = fact_corporate_sales.company_id INNER JOIN dim_segment ON dim_segment.segment_id = fact_corporate_sales.segment_id
WHERE dim_company.company_name LIKE %s GROUP BY fact_corporate_sales.cps_fact_id ORDER BY dim_time.year DESC
如果我想分组,例如dim_time.Year ..我从mysql或控制台得到以下回复
Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db.fact_corporate_sales.fact_cps_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
答案 0 :(得分:1)
解决方案只是执行以下sql:
engine.execute("SET sql_mode='';")
由于我的查询失败的响应是:
"this is incompatible with sql_mode=only_full_group_by"
我必须禁用sql_mode,所以我得到了我的结果。