Die folgende SQLAlchemy-Abfrage kompiliert zu illegalem MSSQL. Es sieht so aus, als ob das generierte MSSQL nach der ursprünglichen, nicht aggregierten Spalte und nicht nach der in der SQLAlchemy-Abfrage angegebenen aggregierten Spalte sortiert. Dieses Problem verschwindet, wenn ich die Beschriftung für die Aggregatspalte ändere; Für unsere Anwendung ist es jedoch wichtig, dass diese Spalte den gleichen Namen wie die Spalte hat, über die sie aggregiert. Ich habe Google in den letzten Tagen durchforstet, aber ich habe keine hilfreichen Vorschläge gefunden. kann mir jemand helfen zu verstehen, was ich falsch mache oder wie ich dieses Problem umgehen kann?SQLAlchemy OperationalError beim Versetzen und Ordnen durch eine Aggregatspalte
price_sum = sqlalchemy.func.sum(
table.c['Opportunity Max Amount']
).label('Opportunity Max Amount')
query = sqlalchemy.select(
columns=[price_sum],
order_by=sqlalchemy.desc(price_sum),
offset=1,
).alias("FOO")
rows = conn.execute(query).fetchall()
Die erzeugte MSSQL:
SELECT anon_1.[Opportunity Max Amount]
FROM (
SELECT
sum([table_name].[Opportunity Max Amount]) AS [Opportunity Max Amount],
ROW_NUMBER() OVER (ORDER BY [Opportunity Max Amount] DESC) AS mssql_rn
FROM [table_name]
) AS anon_1
WHERE mssql_rn > 1
Die erzeugte Postgres Abfrage (diese Abfrage funktioniert wie erwartet, und wird hier als Referenz zur Verfügung gestellt für das, was ich zu erreichen bin versucht):
SELECT
sum(performance_data."Opportunity Max Amount") AS "Opportunity Max Amount"
FROM performance_data
ORDER BY "Opportunity Max Amount" DESC
LIMIT ALL
OFFSET 1
Die Fehlermeldung:
sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (8120, b"Column
'table_name.Opportunity Max Amount' is invalid in the
select list because it is not contained in either an aggregate function or the
GROUP BY clause.DB-Lib error message 20018, severity 16:\nGeneral SQL Server
error: Check messages from the SQL Server\n") [SQL: 'SELECT anon_1.[Opportunity
Max Amount] \nFROM (SELECT sum([table_name].[Opportunity
Max Amount]) AS [Opportunity Max Amount], ROW_NUMBER() OVER (ORDER BY
[Opportunity Max Amount] DESC) AS mssql_rn \nFROM
[table_name]) AS anon_1 \nWHERE mssql_rn > %(param_1)s']
[parameters: {'param_1': 1}]