Avalados por :

Optimización de Consulta SQL para Recuperar Todas las Facturas de Cuentas por Cobrar (AR) con Cálculos Incluidos

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

Hi guys,

I have an issue with below query where basically I want to recover ALL AR invoices, both Service and Item type, and perform some calculations with it.

When I run it as per below, it does not take into account AR invoice Service type.

When I change INNER (in red below) to LEFT JOIN and remove the whole CASE argument in red => AR invoice Service type appears!

When I change INNER (in red below) to LEFT JOIN and keep the CASE argument in red => I get the error "converting data type varchar to numeric".

So frustrating! Hope you can help!

SELECT 'ELL' as 'Database',

'AR invoice' AS 'type',

T0.[DOCTYPE],

CASE WHEN T0.[DOCTYPE] = 'S' THEN T0.[PROJECT] ELSE CAST ( T3.[U_CORBrand] AS nvarchar) END AS 'BRAND',

CASE WHEN T0.[DOCTYPE] = 'S' THEN ' ' ELSE CAST ( T8.[ItmsGrpNam] AS nvarchar) END AS 'Item Group',

CASE WHEN T0.[DOCTYPE] = 'S' THEN ' ' ELSE CAST ( T3.[U_CORAccessory] AS nvarchar) END AS 'Accessory',

T1.[ItemCode],

CASE WHEN T0.[DOCTYPE] = 'S' THEN 0 ELSE CAST ( (T1.[Quantity] * T3.[SalFactor1]) AS decimal) END AS 'PackQty' ,

CASE WHEN T0.[DOCCUR] = 'HKD' THEN T1.[LINETOTAL] ELSE CAST (T1.[TotalFrgn]AS NVARCHAR) END as 'TotalFrgn',

CASE

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

WHEN T3.[U_CORBrand] = 'PK' THEN

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

WHEN T3.[U_CORBrand] = 'KC' THEN

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

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

4 Respuestas

0
Cargando...

Hola Nicolás,

Esto es solo una suposición, pero podría deberse a estas declaraciones: CUENTA > '609999'

El campo de Cuenta es de tipo NVARCHAR, por lo que también permite texto. ¿Tienes alguna cuenta con letras o caracteres especiales en el código?

Saludos,

Johan

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

Hola Nicolás,

Todos los campos en SQL son de un cierto tipo de datos. Hay muchos tipos diferentes, pero todos caen principalmente en tres categorías: texto, números, fechas.

Cuando comparas dos campos, o un campo con un valor de parámetro, el tipo de datos de ambos valores debe coincidir, y los valores en una columna deben ser todos del mismo tipo de datos.

SQL Server siempre intentará automáticamente convertir uno u otro valor para que coincidan. Cuando los tipos de datos son de la misma categoría, generalmente no hay problema. Sin embargo, cuando uno de los valores está en una categoría diferente, SQL Server solo puede realizar ciertas conversiones automáticamente, y algunas puede hacerlas cuando le indicas explícitamente que lo haga.

Cuando tu consulta contiene una columna que se crea programáticamente, como la parte roja de tu consulta, SQL Server mirará los primeros valores y tratará de determinar cuál es el tipo de datos.

En tu consulta original, la declaración CASE devuelve valores numéricos, excepto la primera cláusula WHEN, como encontró Juan Carlos. '' es una cadena vacía, en otras palabras, texto. Entonces, lo que SQL Server encontró fue algo así:

fila 1 valor 1 --> un número

fila 2 valor 10 --> un número

fila 3 valor 5 --> un número

fila 4 valor 132 --> un número

ok, claro, esta columna contiene valores numéricos

fila 5 valor 164 --> un número

etc

fila 12 valor '' --> texto

ese tipo de datos no encaja --> lanzar el error


Saludos,

Johan

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

¡Excelente! ¡Muchas gracias Juan Carlos!

La solución parecía tan simple, me da vergüenza no haber pensado en ello, en realidad tiene sentido, no sé mucho sobre SQL.

Si tienes algo de tiempo, me encantaría tener una explicación.

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

Nicolas,

In your CASE:


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


Change it for this:


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

And change INNER (in red below) to LEFT JOIN

Try it and give us your feedback.

Regards,

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?