在python中使用SQL查询时出现语法错误

问题描述 投票:0回答:1

我尝试在 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 pandas sqlite sqlalchemy
1个回答
0
投票

您的 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

© www.soinside.com 2019 - 2024. All rights reserved.