Bases de Datos > SQL Server

 Sumar Campos con Condiciones

(1/2) > >>

DasGrun:
Buenas, Necesito que me ayuden con el siguiente analisis.

Este es un query; en la columna SALDO cuando el campo DOCTYPE es diferente a 6 y 5 entonces la sumatoria del campo CURTRXAM es positivo de lo contrario es 0.00 y en la columna SALDO1 cuando el campo DOCTYPE es igual a 5 y 6 entonces la sumatoria del campo CURTRXAM es Negativo multiplicandolo por -1 de lo contrario es cero.

el objetivo de este query es presentar cada uno de los vendedores con su ID, Nombre y el saldo. y este campo saldo es la sumatoria del campo SALDO + SALDO1, el resultado en algunos registros me lo presenta mas de una vez(adelante lo verificaran en negrita)


--- Código: SQL ---SELECT DISTINCT   dbo.PM.VENDORID,  dbo.PM00.VENDNAME,  SALDO = (CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN SUM(dbo.PM.CURTRXAM) ELSE '0.00' END) AS FIELD_1,  SALDO1 = (CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN '0.00' ELSE SUM(dbo.PM.CURTRXAM) *-1 END) AS FIELD_2FROM  dbo.PM  INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID)GROUP BY  dbo.PM.VENDORID,  dbo.PM00.VENDNAME,  dbo.PM.DOCTYPE 
el resultado que me presenta es el siguiente:
VENDORID                   VENDNAME                                                                       SALDO                              SALDO1[/b]
05019003077924    BOMBAS Y MOTORES DE HONDURAS, S.A. DE C.V               87810.69                              -87810.69
05019006481226    CORPORACION LA CUMBRE,S.A.                                         0                                      -60001.26
[b]05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      0                                      -50000
05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      0                                      -17000
05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      44044.44                              -44044.44
05019008191648    SERVICIOS INTEROCEANICOS, S.A DE C.V.                          0                                      -208206.49[/b]

lo que necesito es que me presente es lo siguiente:

VENDORID                   VENDNAME                                                                       SALDO                              SALDO1     SALDO_TOTAL
05019003077924    BOMBAS Y MOTORES DE HONDURAS, S.A. DE C.V                87810.69                              -87810.69                      0
05019006481226    CORPORACION LA CUMBRE,S.A.                                          0                                      -60001.26                      -60001.26
05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      0                                      -50000 No debe de presentrase                        
05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      0                                      -17000  No debe de Presentrase
05019007078665    CERAMIC'S STORE AND PLUS, S.A.                                      44044.44                              -44044.44 -67000
05019008191648    SERVICIOS INTEROCEANICOS, S.A DE C.V.                           0                                      -208206.49

Espero que me comprenda con el analisis de esta consulta sql, de ante mano le agradezco con su ayuda y con su tiempo.
Gracias

Shiquilla:
Hay que sacar el SUM fuera del CASE. Quedaría así:


--- Código: SQL ---SELECT DISTINCT   dbo.PM.VENDORID,   dbo.PM00.VENDNAME,   SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1,   SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2 FROM   dbo.PM   INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID) GROUP BY   dbo.PM.VENDORID,   dbo.PM00.VENDNAME,   dbo.PM.DOCTYPE 
Saludos,

DasGrun:
Me Presenta el MIsmo Resultado, lo que pienso hacerlo por medio de Union all, estamos en periodo de Prueba haber que es lo que presenta.

De Ante Mano Muchas Gracias.

Shiquilla:
Perdón,me equivoqué en una línea, hay un error en la condición

--- Código: SQL ---SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2 
Cambiar por:

--- Código: SQL ---SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2 

--- Código: SQL ---SELECT DISTINCT    dbo.PM.VENDORID,    dbo.PM00.VENDNAME,    SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1,    SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2  FROM    dbo.PM    INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID)  GROUP BY    dbo.PM.VENDORID,    dbo.PM00.VENDNAME,    dbo.PM.DOCTYPE 
Saludos,

Shiquilla:
También, he visto en tu mensaje que dices que te presenta el mismo resultado más de una vez (repetidas), eso es por la agrupación que tienes.

--- Código: SQL ---dbo.PM.VENDORID, dbo.PM00.VENDNAME, dbo.PM.DOCTYPE 
Si la pones agrupada por cliente ya estaría (a no ser que DOCTYPE lo necesites para algo)

--- Código: SQL ---dbo.PM.VENDORID, dbo.PM00.VENDNAME 
Saludos,

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa