como condicionar esta consulta con sum(IIF( ??

1,362 views
Skip to first unread message

Saul Piña Hernandez

unread,
Aug 12, 2013, 4:04:57 PM8/12/13
to publice...@googlegroups.com
Saludos

Estoy tratando de realizar esta consulta y no me sale, me podrian ayudar?

SUM(IIF(existe== 'SI' AND dup=='',1,0)) as Unicos

se trata de dos campos EXISTE (aqui esta registrado un "SI", si es que existe) y otro campo llamado DUP (aqui está registrado un "SI", si acaso está duplicado)

Entonces lo que intento es saber que la consulta me sume si en el campo existe="SI" pero que tambien me excluya los duplicados, es decir que DUP='' (vacio)


gracias!



Luis Mata

unread,
Aug 12, 2013, 4:17:48 PM8/12/13
to publice...@googlegroups.com
Usal alltrim()

Felipe Araoz Ramos

unread,
Aug 12, 2013, 4:26:17 PM8/12/13
to publice...@googlegroups.com
Hola
podria ser así si es consulta en trbal de fox

select
 campo1,campo2,sum(iif(existe='SI',campo a sumar,0)
 where duplicados='  ' 
gruup by campo1,campo2

sie es una base de datos


select
 campo1,campo2,sum(case when existe='SI' then campo a sumar else 0 end)
 where duplicados='  ' 
gruup by campo1,campo2

saludos

Felipe
--
Felipe Araoz Ramos
RPM #941990605 / 941990605
RPC 992760385
NXT  822*9500 / 998229500

Carlos Miguel FARIAS

unread,
Aug 12, 2013, 4:41:46 PM8/12/13
to Grupo Fox
En mi caso optaría por poner las dos condiciones en el where y en lugar de sum, uso un count.
SELECT campoAgrupo, COUNT(*) FROM unaTabla WHERE Existe="SI" AND DUP=""
GROUP BY campoAgrupo
Si no hay campo de agrupamiento, el count es suficiente
Después de todo, contar es sumar de a 1, y como siempre un contador te ayuda en tu trabajo (;-D
Saludos: Miguel, La Pampa (RA)

Fernando D. Bozzo

unread,
Aug 12, 2013, 6:49:50 PM8/12/13
to publice...@googlegroups.com
Hola Saul:

Yo coincido con lo que dice Miguel, que parece los más sencillo.


Saludos.-


Message has been deleted

Saul Piña Hernandez

unread,
Aug 12, 2013, 8:03:14 PM8/12/13
to publice...@googlegroups.com
Disculpa fernando pero no puede ser, porque aparte de esa condicion existen otras, para que se den una idea ahi les va la consulta completa:

SELECT distinct area, COUNT(area) as total, SUM(IIF(existe== 'SI',1,0)) as si_existe, SUM(IIF(dup=='' AND v2013=='SI',1,0)) as Si_existe_y_no_esta_duplicado, depto FROM productos GROUP BY depto, area ORDER BY area

Explico lo que intento hacer:

1. En la tabla productos, selecciono por area: Distinct area
2. Cuento todos por Area: Count(area) as Total
3. Del total de todos por area quiero que me muestre los que tienen existencia: SUM(IIF(existe== 'SI',1,0)) as si_existe
4. Y por ultimo deseo que que no me cuente los que esten duplicados en algunas areas y me cuente los que tienen existencia y que no estan duplicados por area: 
    SUM(IIF(dup=='' AND existe=='SI',1,0)) as Si_existe_y_no_esta_duplicado


Como ven se podrá?? 

gracias!

****************************************

Pablo Daniel Lissa

unread,
Aug 12, 2013, 8:15:00 PM8/12/13
to publice...@googlegroups.com
Hola:

¿Y qué probema te está dando al hacerlo como planteas? ¿Arroja resultados incorrectos, arroja error...?

Personalmente, yo usaría EMPTY(ALLTRIM(dup)) en vez de la comparación.

Pero NO creo que esa consulta NO te funcione (nótese la doble negación).

Saludos.

HernanCano

unread,
Aug 12, 2013, 8:23:09 PM8/12/13
to publice...@googlegroups.com

Intenta COUNT() en vez de SUM(), quizá así:

COUNT(EXISTE) for upper(alltrim(EXISTE))=='SI' and empty(DUP) to M.Unicos


(( lamento no poder probarlo en este momento ))

Chao.

HernanCano

unread,
Aug 12, 2013, 8:32:29 PM8/12/13
to publice...@googlegroups.com
Saúl:
Debes mejorar tu forma de programar: tienes bugs con las condiciones: Verifica si los SUM los cambias así:

SUM(IIF(upper(alltrim(existe))== 'SI',1,0)) as si_existe,

SUM(IIF(alltrim(dup)=='' AND upper(alltrim(v2013))=='SI',1,0)) as ...................




HernanCano

unread,
Aug 12, 2013, 8:36:57 PM8/12/13
to publice...@googlegroups.com
Saúl:
Tu consulta es compleja.
Cada campo que tienes en el SELECT tiene condiciones diferentes.
Hasta allá no llego.

Disculpa.

Saul Piña Hernandez

unread,
Aug 12, 2013, 9:04:40 PM8/12/13
to publice...@googlegroups.com
será? porque solo me falto la ultima condicion...por eso le agrege un "AND" y hasta ahi no pude.

Fernando D. Bozzo

unread,
Aug 13, 2013, 5:49:48 AM8/13/13
to publice...@googlegroups.com
Hola Saul:

Acabo de hacer una prueba, y tu consulta me funciona bien.
Hice un cursor con esta estructura:

CREATE CURSOR productos (area N(2), existe C(2), dup C(2), v2013 C(2), depto C(2))


Los datos de prueba que usé fueron estos:


AREA EXISTE DUP V2013 DEPTO
---- ------ --- ----- -----
   1     SI        SI     A
   1     SI        SI     A
   2     SI  SI    SI     A
   2     SI        SI     A
   1     SI        SI     B
   1     SI        SI     B
   2     SI  SI    SI     B
   2     SI        SI     B
---- ------ --- ----- -----

Y luego hice tu consulta, con una leve modificación en la comparación de dup para comparar con 2 espacios:

SELECT distinct ;
    area ;
    , COUNT(area) as total ;
    , SUM(IIF(existe== 'SI',1,0)) as si_existe ;
    , SUM(IIF(dup=='  ' AND v2013=='SI',1,0)) as Si_existe_y_no_esta_duplicado ;

    , depto ;
    FROM productos ;
    GROUP BY depto, area ;
    ORDER BY area

Y el resultado es este:

Area Total Si_existe Si_existe_y_no_esta_duplicado Depto
---- ----- --------- ----------------------------- -----
   1     2         2                             2     A
   1     2         2                             2     B
   2     2         2                             1     A
   2     2         2                             1     B

Como ves, tanto la columna Existe comop la de los No-duplicados calcula bien.

¿No te da el mismo resultado?


Carlos Miguel FARIAS

unread,
Aug 13, 2013, 6:51:11 AM8/13/13
to Grupo Fox
Si estas agrupando por Area, poner DISTINCT Area no tiene sentido (cuantas áreas distintas hay en una misma area), si Agrupas por area, poner count(area) (?) tampoco tiene sentido.
Que funcione bien o no es circunstancial.
En fin, si me acuesto del lado izquierdo y quiero ponerme los zapatos que deje del lado izquierdo, puedo bajarme de la cama por la izquierda o bajarme por el lado derecho, dar la vuelta a la cama y ponerme los zapatos.
Logro el mismo resultado, pero en el primer caso NO SE ENOJA LA PATRONA!!!!
Saludos: Miguel, La Pampa (RA)

Fernando D. Bozzo

unread,
Aug 13, 2013, 6:58:55 AM8/13/13
to publice...@googlegroups.com
Miguel, el DISTINCT no se aplica a un campo solo, sino a todos los campos de la consulta, en este caso area, existe, dup, v2013y depto.
Igualmente tenés razón en que no debería usarse DISTINCT porque no deberían haber registros repetidos.


Saludos.-



Saul Piña Hernandez

unread,
Aug 13, 2013, 7:26:41 AM8/13/13
to publice...@googlegroups.com
Gracias fernando y todos!

ya me funcionó. Excelente ejemplo..lo apliqué y listo

Carlos Miguel FARIAS

unread,
Aug 13, 2013, 10:58:45 AM8/13/13
to Grupo Fox
No vi que agrupaba por Dpto, no me imagino como sumariza en el distinct, ya que el distinct es sobre la fila (o sea, los calculados también) o alguien me esta moviendo el tarro (;-)
Reply all
Reply to author
Forward
0 new messages