2016-05-10 5 views
0

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}] 

Antwort

Verwandte Themen