如何解决通过PYODBC迭代SQL查询,并将结果收集到Pandas DF中
我试图一遍又一遍地查询日期范围内的所有日期,并将每次迭代的结果收集到Pandas DF中。
我建立了一个连接(PYODBC),并创建了一个我想通过SQL查询运行以汇总到DF的日期列表。我确认日期是列表。
documentID
我创建了一个空的DF来收集SQL查询每次迭代的结果,并检查了结构。
link = pyodbc.connect( Connection Details )
date = [d.strftime('%Y-%m-%d') for d in pd.date_range('2020-10-01','2020-10-02')]
type(date)
我的查询设置如下:
empty = pd.DataFrame(columns = ['Date','Balance'])
empty
我尝试了以下for循环,希望将每个查询执行的结果汇总到空df中,但我得到了一个空白df。
sql = """
Select dt as "Date",sum(BAL)/1000 as "Balance"
From sales as bal
where bal.item IN (1,2,3,4)
AND bal.dt = '{}'
group by "Date";
""".format(day)
是否知道该问题是否与SQL设置和/或for循环有关?解决该问题的更好,更有效的方法?
解决方法
通过添加Date
作为GROUP BY
列并传递开始日期和结束日期作为过滤参数,避免循环并运行单个 SQL查询。并使用首选的参数化方法代替pandas.read_sql
支持的字符串格式:
# PREPARED STATEMENT WITH ? PLACEHOLDERS
sql = """SALES dt AS "Date",SUM(BAL)/1000 AS "Balance"
FROM sales
WHERE item IN (1,2,3,4)
AND dt BETWEEN ? AND ?
GROUP BY dt;
"""
# BIND PARAMS TO QUERY RETURN IN SINGLE DATA FRAME
df = pd.read_sql(sql,conn,params=['2020-10-01','2020-10-02'])
,
看起来您在生成sql时未定义day变量。 这可能会有所帮助:
def sql_gen(day):
sql = """
Select dt as "Date",sum(BAL)/1000 as "Balance"
From sales as bal
where bal.item IN (1,4)
AND bal.dt = '{}'
group by "Date";
""".format(day)
return sql
for day in date:
a = (pd.read_sql_query(sql_gen(day),link))
empty.append(a)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。