¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Otimização de Consulta SQL para Recuperar Todas as Faturas de Contas a Receber (AR) com Cálculos Incluídos

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 0 Vistas
0
Cargando...

Olá pessoal,

Estou com um problema na consulta abaixo, onde basicamente quero recuperar TODAS as faturas de AR, tanto do tipo de Serviço quanto do tipo de Item, e realizar alguns cálculos com elas.

Quando executo conforme abaixo, ele não considera o tipo de fatura de AR de Serviço.

Quando altero INNER (em vermelho abaixo) para LEFT JOIN e removo todo o argumento CASE em vermelho => O tipo de fatura de AR de Serviço aparece!

Quando altero INNER (em vermelho abaixo) para LEFT JOIN e mantenho o argumento CASE em vermelho => Recebo o erro "convertendo tipo de dados varchar para numérico".

Tão frustrante! Espero que possam ajudar!

SELECIONE 'ELL' como 'Banco de Dados',

'Fatura de AR' COMO 'tipo',

T0.[DOCTYPE],

CASO QUANDO T0.[DOCTYPE] = 'S' ENTÃO T0.[PROJECT] ELSE CAST ( T3.[U_CORBrand] AS nvarchar) END AS 'MARCA',

CASO QUANDO T0.[DOCTYPE] = 'S' ENTÃO ' ' ELSE CAST ( T8.[ItmsGrpNam] AS nvarchar) END AS 'Grupo de Item',

CASO QUANDO T0.[DOCTYPE] = 'S' ENTÃO ' ' ELSE CAST ( T3.[U_CORAccessory] AS nvarchar) END AS 'Acessório',

T1.[ItemCode],

CASO QUANDO T0.[DOCTYPE] = 'S' ENTÃO 0 ELSE CAST ( (T1.[Quantity] * T3.[SalFactor1]) AS decimal) END AS 'PackQty' ,

CASO QUANDO T0.[DOCCUR] = 'HKD' ENTÃO T1.[LINETOTAL] ELSE CAST (T1.[TotalFrgn]AS NVARCHAR) END as 'TotalFrgn',

CASO

QUANDO T0.[DOCTYPE] = 'S' ENTÃO ' '

QUANDO T3.[U_CORBrand] = 'PK' ENTÃO

T1.[TotalSumSy]*((SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '609999' E ACCOUNT <'613999' E PROJECT ='PK')/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E PROJECT = 'PK'))+T1.[TotalSumSy]*(((SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '609999' E ACCOUNT <'613999' E PROJECT ='CENTRAL')*(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E PROJECT = 'PK')/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002'))/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E PROJECT = 'PK'))

QUANDO T3.[U_CORBrand] = 'KC' ENTÃO

T1.[TotalSumSy]*((SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '609999' E ACCOUNT <'613999' E PROJECT ='K&C')/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E PROJECT = 'K&C'))+T1.[TotalSumSy]*(((SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '609999' E ACCOUNT <'613999' E PROJECT ='CENTRAL')*(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E PROJECT = 'K&C')/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002'))/(SELECIONE SUM( SYSCRED-SYSDEB) FROM LIVE_ELL.DBO.JDT1 WHERE ACCOUNT > '699999' E ACCOUNT < '700002' E

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Olá Nicolás,

Isto é apenas uma suposição, mas pode dever-se a estas declarações: CONTA > '609999'

O campo de Conta é do tipo NVARCHAR, portanto, também permite texto. Você tem alguma conta com letras ou caracteres especiais no código?

Saudações,

Johan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Olá Nicolás,

Todos os campos no SQL são de um certo tipo de dados. Existem muitos tipos diferentes, mas todos se enquadram principalmente em três categorias: texto, números, datas.

Ao comparar dois campos, ou um campo com um valor de parâmetro, o tipo de dados de ambos os valores deve coincidir, e os valores em uma coluna devem ser todos do mesmo tipo de dados.

O SQL Server sempre tentará converter automaticamente um dos valores para que coincidam. Quando os tipos de dados estão na mesma categoria, geralmente não há problema. No entanto, quando um dos valores está em uma categoria diferente, o SQL Server só pode realizar certas conversões automaticamente, e algumas podem ser feitas quando você indica explicitamente.

Quando sua consulta contém uma coluna que é criada programaticamente, como a parte vermelha de sua consulta, o SQL Server olhará os primeiros valores e tentará determinar qual é o tipo de dados.

Em sua consulta original, a declaração CASE retorna valores numéricos, exceto a primeira cláusula WHEN, onde encontrou Juan Carlos. '' é uma string vazia, em outras palavras, texto. Então, o que o SQL Server encontrou foi algo assim:

linha 1 valor 1 --> um número

linha 2 valor 10 --> um número

linha 3 valor 5 --> um número

linha 4 valor 132 --> um número

ok, claro, esta coluna contém valores numéricos

linha 5 valor 164 --> um número

etc

linha 12 valor '' --> texto

esse tipo de dados não se encaixa --> lançar o erro


Saudações,

Johan

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Excelente! Muito obrigado, Juan Carlos!

A solução parecia tão simples, sinto vergonha de não ter pensado nisso, na verdade faz sentido, não sei muito sobre SQL.

Se tiver um tempo, adoraria ter uma explicação.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Nicolas,

No seu CASO:


CASE
  WHEN T0.[DOCTYPE] = 'S' THEN ''


Mude para isso:


CASE
  WHEN T0.[DOCTYPE] = 'S' THEN 0

E mude INNER (em vermelho abaixo) para LEFT JOIN

Tente e nos dê seu feedback.

Cumprimentos,

JC

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?