在mysql中有一个以下字段内容的数据表data,现在希望能够增加一个字段“本期止累计”作为当月累计销量的记录,比如2月份的本期止累计是1-2月份销量的合计,3月份的本期止累计是1-3月份销量的合计,本文通过Python和SQL两种方法来实现:
Python方法:
Python方法主要是通过pandas读取mysql中的数据再处理实现:
import pandas as pd
from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://账户:密码@数据库IP')
sql = "'select * from data;'"
df1=pd.read_sql_query(sql, engine)#从mysql获取数据df1
def def1(x):
dfn=df1.loc[(df1['年份']==x['年份'])&(df1['月份']<=x['月份'])&(df1['企业']==x['企业'])]
return dfn['销量'].sum() #定义函数def1 计算销量合计
df1['本期止累计']=df1.apply(def1,axis = 1)
df1.to_excel('结果.xlsx')
SQL方法:
SQL方法则相对简单一些
SELECT
*,(
SELECT
SUM(本月销量)
FROM
data T
WHERE
T.年份 = A.年份
AND T.月份 <= A.月份
AND T.企业 = A.企业
) 本期止累计
FROM
data A
不过以上两种方法必须保证是企业、年份、月份三个字段组合的唯一性,比如企业1有两条2011年1月份的销量记录,就会出现问题,在处理之前进行聚合来保证企业、年份、月份三个字段组合的唯一性。
Python可以采用
df1=df1.groupby(['年份','月份','企业']).agg(sum)
SQL 可以采用
WITH data1 as (select 年份,月份,企业,sum(销量) 销量 from data)
对数据进行聚合