使用相同的列值对值进行分组/汇总

时间:2016-06-01 08:50:39

标签: mysql sql sqlalchemy

我试图解决一个看起来像下面写的代码的问题,但是由于缺乏知识和通过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

1 个答案:

答案 0 :(得分:1)

解决方案只是执行以下sql:

engine.execute("SET sql_mode='';")

由于我的查询失败的响应是:

"this is incompatible with sql_mode=only_full_group_by"

我必须禁用sql_mode,所以我得到了我的结果。