我尝试在 Python 程序中使用
sql
字符串,但我不断收到相同的错误。
这是我尝试运行的查询:
df3=pd.read_csv(r'path')
conn = sqlite3.connect("Any_Database_Name.db")
df3.to_sql('t1', conn)
sql_string ="""
SELECT
tipo,
AVG(valor) AS avg_trim,
((MAX(valor) - MIN(valor)) / MIN(valor)) * 100 AS per_incr
FROM t5
WHERE tipo = 'debt'
AND date >= DATE_SUB('2023-12-21', INTERVAL 2 YEAR)
GROUP BY tipo, YEAR(date), QUARTER(date)
HAVING YEAR(date) = YEAR('2023-12-21') OR YEAR((data) = YEAR('2022-12-21') - 1)
ORDER BY tipo, YEAR(date), QUARTER(date)
"""
df4 = pd.read_sql(sql_string, conn)
我得到的错误如下:
OperationalError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs)
2022 try:
-> 2023 cur.execute(*args, **kwargs)
2024 return cur
OperationalError: near "2": syntax error
上述异常是导致以下异常的直接原因:
DatabaseError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_26132\1287340392.py in <module>
22 ORDER BY tipo, YEAR(data), QUARTER(data)
23 """
---> 24 df4 = pd.read_sql(sql_string, conn)
25
26 df4
~\Anaconda3\lib\site-packages\pandas\io\sql.py in read_sql(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)
565
566 if isinstance(pandas_sql, SQLiteDatabase):
--> 567 return pandas_sql.read_query(
568 sql,
569 index_col=index_col,
~\Anaconda3\lib\site-packages\pandas\io\sql.py in read_query(self, sql, index_col, coerce_float, params, parse_dates, chunksize, dtype)
2081
2082 args = _convert_params(sql, params)
-> 2083 cursor = self.execute(*args)
2084 columns = [col_desc[0] for col_desc in cursor.description]
2085
~\Anaconda3\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs)
2033
2034 ex = DatabaseError(f"Execution failed on sql '{args[0]}': {exc}")
-> 2035 raise ex from exc
2036
2037 @staticmethod
DatabaseError: Execution failed on sql '
SELECT
tipo,
AVG(valor) AS avg_trim,
((MAX(valor) - MIN(valor)) / MIN(valor)) * 100 AS per_incr
FROM t7
WHERE tipo = 'debt'
AND data >= DATE_SUB('2023-12-21', INTERVAL 2 YEAR)
GROUP BY tipo, YEAR(date), QUARTER(date)
HAVING YEAR(date) = YEAR('2023-12-21') OR YEAR(data) = YEAR('2022-12-21') - 1
AND QUARTER(date) = YEAR('22-12-21')
ORDER BY tipo, YEAR(date), QUARTER(date)
': near "2": syntax error
我尝试调试查询,但总是出现相同的错误。
您的 SQL 似乎无效。
首先,YEAR() 和 QUARTER() 被分组和排序,但从未被选择。许多数据库不允许这样做。然而,SQLite 似乎没有 YEAR() 或 QUARTER() 函数。
https://www.db-fiddle.com/f/9rBcfdpqniVSYDe7YwfMV3/0
您想使用 strftime('%Y',date) 表示 YEAR https://www.sqlite.org/lang_datefunc.html