*I am suffering!It showed the same message.*
# Subquery para buscar o maior registro de estoqueempresa para cada produto estoqueAtual = session.query( EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque, func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia') ).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque).subquery () #print(estoqueAtual) # Realiza a consulta com SQLAlchemy ##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\ ## .join(ProdutoEmpresa, Produto.IdProduto == ProdutoEmpresa.IdProduto)\ ## .join(CodigoProduto, Produto.IdProduto == CodigoProduto.IdProduto)\ ## .join(estoqueAtual, and_(Produto.IdProduto == estoqueAtual.c.IdProduto))\ ## .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == Produto.IdProduto))\ ## .filter(ProdutoEmpresa.StAtivoVenda == 'S')\ ## .filter(ProdutoEmpresa.CdEmpresa == 4)\ ## .order_by(Produto.NmProduto) query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, Produto. NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, EstoqueEmpresa.DtReferencia, EstoqueEmpresa.QtEstoque)\ .join(ProdutoEmpresa, Produto.IdProduto == ProdutoEmpresa. IdProduto)\ .join(CodigoProduto, Produto.IdProduto == CodigoProduto. IdProduto)\ .join(estoqueAtual, and_(Produto.IdProduto == estoqueAtual.c.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c.MaxDtReferencia))\ .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == Produto.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c .MaxDtReferencia))\ .filter(ProdutoEmpresa.StAtivoVenda == 'S')\ .filter(ProdutoEmpresa.CdEmpresa == 4)\ .order_by(Produto.NmProduto) Em sex., 14 de abr. de 2023 às 15:21, Mike Bayer < mike_not_on_goo...@zzzcomputing.com> escreveu: > the initial issue is that you want DtReferencia from the subquery on the > outside: > > session.query(..., estoqueAtual.c.DtReferencia, ...) > > and not "EstoqueEmpresa.DtReferencia", that's not available in the FROM > list, it's inside a subquery. > > also I dont think you'd want to "group by" the same column that you are > feeing into max().that would defeat the purpose of using an aggregate. > > On Fri, Apr 14, 2023, at 1:30 PM, Elias Coutinho wrote: > > Good afternoon. > I am having trouble transforming a SQL Server query to SQL Alchemy. > > *The SQL Server query is this* > > SELECT CP.CdChamada, P.NmProduto, PE.VlPrecoCusto, PE.VlPrecoSugerido, > EE.QtEstoque, EE.DtReferencia > FROM Produto P > INNER JOIN Produto_Empresa PE ON P.IdProduto = PE.IdProduto > INNER JOIN CodigoProduto CP ON P.IdProduto = CP.IdProduto > INNER JOIN (SELECT IdProduto, CdEmpresa, MAX(DtReferencia) AS > MaxDtReferencia > FROM EstoqueEmpresa > GROUP BY IdProduto, CdEmpresa) AS EE2 ON EE2.IdProduto = > P.IdProduto AND EE2.CdEmpresa = PE.CdEmpresa > INNER JOIN EstoqueEmpresa EE ON EE.IdProduto = EE2.IdProduto AND > EE.DtReferencia = EE2.MaxDtReferencia AND EE.CdEmpresa = EE2.CdEmpresa > WHERE PE.StAtivoVenda = 'S' AND > PE.CdEmpresa = 4 AND > CP.IdTipoCodigoProduto = '00A0000002' > ORDER BY CP.CdChamada > > *My code is as follows:* > *My Model* > class EstoqueEmpresa(Base): > __tablename__ = 'EstoqueEmpresa' > > IdProduto = Column(CHAR(10, 'SQL_Latin1_General_CP850_CI_AI'), > primary_key=True, nullable=False) > CdEmpresa = Column(Integer, primary_key=True, nullable=False) > DtReferencia = Column(DateTime, primary_key=True, nullable=False, > index=True) > VersaoRegistro = Column(TIMESTAMP, nullable=False) > QtCompra = Column(Float(53)) > VlCompra = Column(Float(53)) > QtVenda = Column(Float(53)) > VlVenda = Column(Float(53)) > VlCustoMercadoriaVendida = Column(Float(53)) > QtEntrada = Column(Float(53)) > VlEntrada = Column(Float(53)) > QtSaida = Column(Float(53)) > VlSaida = Column(Float(53)) > VlSaidaAcerto = Column(Float(53)) > QtSaidaAcerto = Column(Float(53)) > QtEstoque = Column(Float(53)) > VlEstoque = Column(Float(53)) > VlUltimoCustoMedio = Column(Float(53)) > DtInicialAlinhamentoEstoque = Column(DateTime) > QtCompraNaoAtualizaCustoMedio = Column(Float(53)) > VlCompraNaoAtualizaCustoMedio = Column(Float(53)) > QtEntradaNaoAtualizaCustoMedio = Column(Float(53)) > VlEntradaNaoAtualizaCustoMedio = Column(Float(53)) > > *My code* > from sqlalchemy import create_engine, text, Column, update, insert, select > from sqlalchemy.orm.exc import NoResultFound > from sqlalchemy.orm import Session > from sqlalchemy.orm import sessionmaker > from sqlalchemy import func, and_ > > import unidecode > import pandas as pd > from datetime import datetime > import re > import itertools > > from itertools import islice > > # Importo somente as tabelas que vou usar > from models import CodigoProduto, ProdutoEmpresa, EstoqueEmpresa, Produto > > > #------------------------------------------------------------------------------------------------------------------------------------- > # Configuração da conexão com o banco de dados > USER = 'sa' > PASSWORD = 'Abc*123' > HOST = 'SERVER-02\MSSQLSERVERB' > DATABASE = 'ALTERDATA_TESTE' > > engine = create_engine(f'mssql+pyodbc://{USER}:{PASSWORD}@{HOST}/{DATABASE > }?driver=ODBC+Driver+17+for+SQL+Server') > > # Create a Session object > Session = sessionmaker(bind=engine) > session = Session() > > > > #------------------------------------------------------------------------------------------------------------------------------------- > # Subquery para buscar o maior registro de estoqueempresa para cada produto > estoqueAtual = session.query( > EstoqueEmpresa.IdProduto, > EstoqueEmpresa.QtEstoque, > func.max(EstoqueEmpresa.DtReferencia).label('MaxDtReferencia') > ).group_by(EstoqueEmpresa.IdProduto, EstoqueEmpresa.QtEstoque, > EstoqueEmpresa.DtReferencia).subquery() > > #print(estoqueAtual) > > # Realiza a consulta com SQLAlchemy > ##query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, > Produto.NmProduto, ProdutoEmpresa.VlPrecoCusto, > ProdutoEmpresa.VlPrecoSugerido, estoqueAtual.c.QtEstoque)\ > ## .join(ProdutoEmpresa, Produto.IdProduto == > ProdutoEmpresa.IdProduto)\ > ## .join(CodigoProduto, Produto.IdProduto == > CodigoProduto.IdProduto)\ > ## .join(estoqueAtual, and_(Produto.IdProduto == > estoqueAtual.c.IdProduto))\ > ## .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == > Produto.IdProduto))\ > ## .filter(ProdutoEmpresa.StAtivoVenda == 'S')\ > ## .filter(ProdutoEmpresa.CdEmpresa == 4)\ > ## .order_by(Produto.NmProduto) > > query = session.query(CodigoProduto.CdChamada, Produto.IdProduto, Produto. > NmProduto, ProdutoEmpresa.VlPrecoCusto, ProdutoEmpresa.VlPrecoSugerido, > EstoqueEmpresa.DtReferencia, estoqueAtual.c.QtEstoque)\ > .join(ProdutoEmpresa, Produto.IdProduto == ProdutoEmpresa. > IdProduto)\ > .join(CodigoProduto, Produto.IdProduto == CodigoProduto. > IdProduto)\ > .join(estoqueAtual, and_(Produto.IdProduto == estoqueAtual. > c.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c > .MaxDtReferencia))\ > .join(EstoqueEmpresa, and_(EstoqueEmpresa.IdProduto == > Produto.IdProduto, EstoqueEmpresa.DtReferencia == estoqueAtual.c > .MaxDtReferencia))\ > .filter(ProdutoEmpresa.StAtivoVenda == 'S')\ > .filter(ProdutoEmpresa.CdEmpresa == 4)\ > .order_by(Produto.NmProduto) > > > print(query) > > # Execute the query and get the result as a list of dicts > result = query.all() > print(result) > > # Pass the result to pd.DataFrame() to create the DataFrame > df_produtos = pd.DataFrame(result) > > # exporta o dataframe para um arquivo Excel > df_produtos.to_excel('teste_join.xlsx') > > # Close the Session > session.close() > > print('***** FIM *****') > > > *My Traceback*SELECT [CodigoProduto].[CdChamada] AS > [CodigoProduto_CdChamada], [Produto].[IdProduto] AS [Produto_IdProduto], > [Produto].[NmProduto] AS [Produto_NmProduto], > [Produto_Empresa].[VlPrecoCusto] AS [Produto_Empresa_VlPrecoCusto], > [Produto_Empresa].[VlPrecoSugerido] AS [Produto_Empresa_VlPrecoSugerido], > [EstoqueEmpresa].[DtReferencia] AS [EstoqueEmpresa_DtReferencia], > anon_1.[QtEstoque] AS [anon_1_QtEstoque] > FROM [Produto] JOIN [Produto_Empresa] ON [Produto].[IdProduto] = > [Produto_Empresa].[IdProduto] JOIN [CodigoProduto] ON [Produto].[IdProduto] > = [CodigoProduto].[IdProduto] JOIN (SELECT [EstoqueEmpresa].[IdProduto] AS > [IdProduto], [EstoqueEmpresa].[QtEstoque] AS [QtEstoque], > max([EstoqueEmpresa].[DtReferencia]) AS [MaxDtReferencia] > FROM [EstoqueEmpresa] GROUP BY [EstoqueEmpresa].[IdProduto], > [EstoqueEmpresa].[QtEstoque], [EstoqueEmpresa].[DtReferencia]) AS anon_1 ON > [Produto].[IdProduto] = anon_1.[IdProduto] AND > [EstoqueEmpresa].[DtReferencia] = anon_1.[MaxDtReferencia] JOIN > [EstoqueEmpresa] ON [EstoqueEmpresa].[IdProduto] = [Produto].[IdProduto] > AND [EstoqueEmpresa].[DtReferencia] = anon_1.[MaxDtReferencia] > WHERE [Produto_Empresa].[StAtivoVenda] = ? AND > [Produto_Empresa].[CdEmpresa] = ? ORDER BY [Produto].[NmProduto] > Traceback (most recent call last): > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1964, in _exec_single_context > self.dialect.do_execute( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\default.py", > line 748, in do_execute > cursor.execute(statement, parameters) > pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for > SQL Server][SQL Server]The multi-part identifier > "EstoqueEmpresa.DtReferencia" could not be bound. (4104) (SQLExecDirectW); > [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) > could not be prepared. (8180)') > > The above exception was the direct cause of the following exception: > > Traceback (most recent call last): > File "c:\Users\SV\Desktop\codes_sv\fone.py", line 65, in <module> > result = query.all() > File "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\orm\query.py", > line 2697, in all > return self._iter().all() # type: ignore > File "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\orm\query.py", > line 2855, in _iter > result: Union[ScalarResult[_T], Result[_T]] = self.session.execute( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\orm\session.py", line > 2229, in execute > return self._execute_internal( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\orm\session.py", line > 2124, in _execute_internal > result: Result[Any] = compile_state_cls.orm_execute_statement( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\orm\context.py", line > 253, in orm_execute_statement > result = conn.execute( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1414, in execute > return meth( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\sql\elements.py", line > 486, in _execute_on_connection > return connection._execute_clauseelement( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1638, in _execute_clauseelement > ret = self._execute_context( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1842, in _execute_context > return self._exec_single_context( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1983, in _exec_single_context > self._handle_dbapi_exception( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 2326, in _handle_dbapi_exception > raise sqlalchemy_exception.with_traceback(exc_info[2]) from e > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\base.py", line > 1964, in _exec_single_context > self.dialect.do_execute( > File > "C:\Users\SV\kivy_venv\lib\site-packages\sqlalchemy\engine\default.py", > line 748, in do_execute > cursor.execute(statement, parameters) > sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', > '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The > multi-part identifier "EstoqueEmpresa.DtReferencia" could not be bound. > (4104) (SQLExecDirectW); > [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) > could not be prepared. (8180)') > [SQL: SELECT [CodigoProduto].[CdChamada] AS [CodigoProduto_CdChamada], > [Produto].[IdProduto] AS [Produto_IdProduto], [Produto].[NmProduto] AS > [Produto_NmProduto], [Produto_Empresa].[VlPrecoCusto] AS > [Produto_Empresa_VlPrecoCusto], [Produto_Empresa].[VlPrecoSugerido] AS > [Produto_Empresa_VlPrecoSugerido], [EstoqueEmpresa].[DtReferencia] AS > [EstoqueEmpresa_DtReferencia], anon_1.[QtEstoque] AS [anon_1_QtEstoque] > FROM [Produto] JOIN [Produto_Empresa] ON [Produto].[IdProduto] = > [Produto_Empresa].[IdProduto] JOIN [CodigoProduto] ON [Produto].[IdProduto] > = [CodigoProduto].[IdProduto] JOIN (SELECT [EstoqueEmpresa].[IdProduto] AS > [IdProduto], [EstoqueEmpresa].[QtEstoque] AS [QtEstoque], > max([EstoqueEmpresa].[DtReferencia]) AS [MaxDtReferencia] > FROM [EstoqueEmpresa] GROUP BY [EstoqueEmpresa].[IdProduto], > [EstoqueEmpresa].[QtEstoque], [EstoqueEmpresa].[DtReferencia]) AS anon_1 ON > [Produto].[IdProduto] = anon_1.[IdProduto] AND > [EstoqueEmpresa].[DtReferencia] = anon_1.[MaxDtReferencia] JOIN > [EstoqueEmpresa] ON [EstoqueEmpresa].[IdProduto] = [Produto].[IdProduto] > AND [EstoqueEmpresa].[DtReferencia] = anon_1.[MaxDtReferencia] > WHERE [Produto_Empresa].[StAtivoVenda] = ? AND > [Produto_Empresa].[CdEmpresa] = ? ORDER BY [Produto].[NmProduto]] > [parameters: ('S', 4)] > (Background on this error at: https://sqlalche.me/e/20/f405) > > > > > > *I don't know where to reference this field "CompanyStock.DtReference".I > just wanted the largest of each idproduct.* > > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/e0345071-902f-454d-bd4c-1e4262d03b84n%40googlegroups.com > <https://groups.google.com/d/msgid/sqlalchemy/e0345071-902f-454d-bd4c-1e4262d03b84n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/fc187fa4-d018-456e-90a4-c8f9e290e141%40app.fastmail.com > <https://groups.google.com/d/msgid/sqlalchemy/fc187fa4-d018-456e-90a4-c8f9e290e141%40app.fastmail.com?utm_medium=email&utm_source=footer> > . > -- Elias Coutinho. Aprender sobre alguns assuntos é fundamental. Aprender sobre Deus é indiscutivelmente o melhor conteúdo. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/CALgom8qmxUOzw6kN6Cyg7efVSYKdnaP3bfcxe5jfG_2AVu8jSw%40mail.gmail.com.