我正在尝试解决一个看起来像下面的代码的问题,但是由于缺乏知识并通读sqlalchemy文档,因此我还没有真正找到解决该问题的方法。
目标:如果year_column中的年份相同,则获取sales_in_usd的总和
到目前为止,我得到的是通过调试并通过使用以下查询通过Google 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
sun_segment
segment_id segment_nom
1 basketball
2 running
3 soccer
4 watersports
昏暗的时间
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是3次。因此,可以将这些值进行汇总并显示为摘要。
我从标准SQL知道,可以通过使用group by和聚合函数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
解决方案是仅执行以下sql:
engine.execute("SET sql_mode='';")
由于我失败的查询的响应是:
"this is incompatible with sql_mode=only_full_group_by"
我不得不禁用sql_mode,所以我也得到了结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句