Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-01-2015
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
Resta de dos Querys

Que tal a todos, buen dia.
Les escribo para pedir su ayuda ya que tengo algunos dias lidiando con una consulta SQL y de la cual le resto el valor de otra consulta SQL pero me marca error.
Código SQL [-]
SELECT DISTINCT a.CVE_ART, b.EXIST -
                          (SELECT DISTINCT a.CVE_ART, b.EXIST AS DISPONIBLES
                            FROM          PAR_FACTP02 AS a LEFT OUTER JOIN
                                                   MULT02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                                                   FACTP02 AS c ON a.CVE_DOC = c.CVE_DOC LEFT OUTER JOIN
                                                   INVE02 AS d ON a.CVE_ART = d.CVE_ART
                            WHERE      (c.STATUS <> 'C') AND (b.CVE_ALM = 1) AND (b.EXIST > 0)
                            GROUP BY a.CANT, a.CVE_ART, b.EXIST) AS DISPONIBLES
FROM         PAR_FACTP02 AS a LEFT OUTER JOIN
                      MULT02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                      FACTP02 AS c ON a.CVE_DOC = c.CVE_DOC LEFT OUTER JOIN
                      INVE02 AS d ON a.CVE_ART = d.CVE_ART
WHERE     (b.CVE_ALM = 1) AND (c.STATUS <> 'C') AND (b.EXIST > 0)
GROUP BY a.CANT, a.CVE_ART, b.EXIST

De esta consulta, la primera obtiene el total de mercancias de las tablas en cuestion, (b.EXIST-(SELECT DISTINCT SUM(.......)) esta subconsulta hace la suma de algunos productos que cumplen cierta condicion y devuelve el valor que al final se resta de la consulta inicial. Pero me manda un error en SQL :
Mensaje de error: Solo se puede especificar una expresion en la llista de seleccion cuando la subconsulta no se especifica con EXISTS

Haciendo mencion de que uso MS-SQL 2008


Anterior habia realizado una subconsulta similar pero con otras tablas, valores y condiciones sin problema; pero esta no funciona.
Espero haber sido claro en la descripcion.

Agradezco de antemano su tiempo y ayuda.
Responder Con Cita
  #2  
Antiguo 29-01-2015
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Qué tal, buen día.

Sin mirar bien, me parece que en la subconsulta sobra el primer campo. O algo así, ya que debería traer solamente un dato para poder hacer la resta.

-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 29-01-2015
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
TOPX
Agradezco tu respuesta. Le he quitado el primer campo en la subconsulta y ya no marca error de EXIST. Ahora el error que envia es La subconsulta ha devuelto mas de un valor, lo que no es correcto cuando va a continuacion de =,!=,<<,<=,>,>= o cuando se utiliza como expresion
Código SQL [-]
SELECT DISTINCT a.CVE_ART, b.EXIST -
                          (SELECT     b.EXIST
                            FROM          PAR_FACTP02 AS a LEFT OUTER JOIN
                                                   MULT02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                                                   FACTP02 AS c ON a.CVE_DOC = c.CVE_DOC LEFT OUTER JOIN
                                                   INVE02 AS d ON a.CVE_ART = d.CVE_ART
                            WHERE      (c.STATUS <> 'C') AND (b.CVE_ALM = 1) AND (b.EXIST > 0)
                            GROUP BY b.EXIST) AS DISPONIBLES
FROM         PAR_FACTP02 AS a LEFT OUTER JOIN
                      MULT02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                      FACTP02 AS c ON a.CVE_DOC = c.CVE_DOC LEFT OUTER JOIN
                      INVE02 AS d ON a.CVE_ART = d.CVE_ART
WHERE     (b.CVE_ALM = 1) AND (b.EXIST > 0) AND (c.STATUS <> 'C')
GROUP BY a.CANT, a.CVE_ART, b.EXIST
Como lo comente y quizás no haya sido clara la descripcion es asi:
tengo una consulta que saca toda la informacion que necesito Nombre producto y cantidades físicas (CVE_ART, EXIST) hasta ahi no hay problema, la subconsulta me suma la misma informacion pero considerando de otra tabla el valor de un apartado (por asi decirlo) si esta marcado como apartado, suma la cantidad de ese producto (CANT) y deberia o la pretencion es que reste esta SUM de la primera consulta sin afectar la cantidad de productos que no estan marcados como apartados.

he leído algunos posts al respecto pero no me queda claro como hacer esta subconsulta.

Gracias & saludos
Responder Con Cita
  #4  
Antiguo 29-01-2015
aposi aposi is offline
Miembro
 
Registrado: dic 2006
Posts: 146
Poder: 18
aposi Va por buen camino
Por lo que veo el segundo select recoges los mismos datos que en el primero.
Lo que quieres hacer es así:

Código SQL [-]
SELECT DISTINCT a.CVE_ART, b.EXIST -  
                         (SELECT    sum(b1.EXIST)
                             FROM          PAR_FACTP02 AS a2 LEFT OUTER JOIN
                                                    MULT02 AS b2 ON a2.CVE_ART = b2.CVE_ART LEFT OUTER JOIN
                                                    FACTP02 AS c2 ON a2.CVE_DOC = c2.CVE_DOC LEFT OUTER JOIN
                                                    INVE02 AS d2 ON a.CVE_ART = d2.CVE_ART
                             WHERE      (c2.STATUS <> 'C') AND (b2.CVE_ALM = 1) AND (b2.EXIST > 0) and (a2.CVE_ART = a.CVE_ART)
                             GROUP BY b2.EXIST) AS DISPONIBLES
 FROM        
 PAR_FACTP02 AS a LEFT OUTER JOIN
                       MULT02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                       FACTP02 AS c ON a.CVE_DOC = c.CVE_DOC LEFT OUTER JOIN
                       INVE02 AS d ON a.CVE_ART = d.CVE_ART 
WHERE
     (b.CVE_ALM = 1) AND (b.EXIST > 0) AND (c.STATUS <> 'C') GROUP BY a.CANT, a.CVE_ART, b.EXIST

Observa que en este query he cambiado los alias de las tablas y he puesto

Código SQL [-]
and (a2.CVE_ART = a.CVE_ART)

De esta manera el segundo query obtendra el estock del producto que esta procesando el primer query
Responder Con Cita
  #5  
Antiguo 29-01-2015
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
Aposi
Gracias por tu respuesta, ejecute el query como lo presentas y los resultados que da son algunos en - (negativo) y cantidades inexistentes

En tanto modifique el query donde sale la informacion principal de la que posteriormente se resta la consulta del otro query
el primero es asi:
Código SQL [-]
SELECT     CVE_ART, EXIST
FROM         MULT02
WHERE     (CVE_ALM = 1) AND (EXIST > 0)
Este Primer query me da el total de articulos en el almacen de venta y sus respectivas cantidades

Código SQL [-]
SELECT     a.CVE_ART, SUM(a.CANT) AS CANTIDAD
FROM         PAR_FACTP02 AS a LEFT OUTER JOIN
                      FACTP02 AS b ON a.CVE_DOC = b.CVE_DOC
WHERE     (b.STATUS <> 'C') AND (a.APAR <> 0)
GROUP BY a.CVE_ART, a.CANT
Este query me da la suma de articulos que se han "apartado" y es el que deberia de "restarse" del primer query para que de algo asi:

si los ejecuto independientes trabajan sin problema y con la informacion correcta

primer query:
Articulo|Cantidad
MONITOR LED 32"|25
MOUSE INALAMBRICO|7


segundo query
Articulo|Cantidad
MONITOR LED 32"|10
MOUSE INALAMBRICO|3

Resultado de la operación deseada
Articulo|Cantidad
MONITOR LED 32"|15
MOUSE INALAMBRICO|4

como pueden ver modifique el primer query a lo mas basico sacando los datos que me interesan y el segundo obtiene los datos de los "apartados" y no he logrado que trabaje como pretendo.

Seguire en la practica buscando la respuesta y si alguien tiene alguna idea se le agradece

Saludos
Responder Con Cita
  #6  
Antiguo 29-01-2015
aposi aposi is offline
Miembro
 
Registrado: dic 2006
Posts: 146
Poder: 18
aposi Va por buen camino
Solo tienes que poner el segundo select dentro del primero con la union del codigo de articulo

Código SQL [-]
SELECT     p.CVE_ART, p.EXIST - 
(
SELECT     SUM(a.CANT) AS CANTIDAD
FROM         PAR_FACTP02 AS a LEFT OUTER JOIN
                      FACTP02 AS b ON a.CVE_DOC = b.CVE_DOC
WHERE     (b.STATUS <> 'C') AND (a.APAR <> 0) and (a.CVE_ART = P.CVE_ART) 
GROUP BY a.CVE_ART

)
FROM         MULT02 P
WHERE     (p.CVE_ALM = 1) AND (p.EXIST > 0)
Responder Con Cita
  #7  
Antiguo 30-01-2015
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
Talking

Aposi

Gracias por tu aportacion, ejecute el query como lo editaste y no envio error. Solo que en el campo de CANTIDAD muestra en todos valores NULL, creo que la subconsulta no esta funcionando. Tendrá algo que ver la columna EXIST, digo que la relacione como palabra reservada o similar? lamentablemente de ser así no puedo cambiar el nombre de ese campo en la BD. Es lo único que de momento se me ocurre ya que en las pruebas anteriores el MS-SQL menciona algo relacionado a EXIST



Gracias & saludos
Responder Con Cita
  #8  
Antiguo 30-01-2015
Jose Carlos Rey Jose Carlos Rey is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 26
Poder: 0
Jose Carlos Rey Va por buen camino
Otra prueba
He estado realizando cambios en la estructura de la consulta(no gran cosa, redunda practicamente en la misma) con el mismo error.
el codigo es el siguiente:
Código SQL [-]
SELECT DISTINCT a.CVE_ART, b.DESCR, a.EXIST -
                          (SELECT     z.CVE_ART, SUM(z.CANT) AS Expr1
                            FROM          PAR_FACTP02 AS z LEFT OUTER JOIN
                                                   FACTP02 AS y ON z.CVE_DOC = y.CVE_DOC
                            WHERE      (y.STATUS <> 'C') AND (z.APAR <> 0)
                            GROUP BY z.CVE_ART, z.CANT) AS Expr1, c.PRECIO
FROM         MULT02 AS a LEFT OUTER JOIN
                      INVE02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                      PRECIO_X_PROD02 AS c ON a.CVE_ART = c.CVE_ART LEFT OUTER JOIN
                      PAR_FACTP02 AS d ON a.CVE_ART = d.CVE_ART LEFT OUTER JOIN
                      FACTP02 AS e ON d.CVE_DOC = e.CVE_DOC
WHERE     (e.STATUS <> 'C') AND (a.CVE_ALM = 1) AND (c.CVE_PRECIO = 1) AND (a.EXIST <> 0)
ORDER BY a.CVE_ART

si se ejecuta la consulta individual funcionan, pero al incluirlas envia el error:
"Solo se puede especificar una expresion en la lista de seleccion cuando la subconsulta no se especifica con EXIST"

consulta individual (Subconsulta): OK
Código SQL [-]
SELECT     z.CVE_ART, SUM(z.CANT) AS Expr1
FROM         PAR_FACTP02 AS z LEFT OUTER JOIN
                      FACTP02 AS y ON z.CVE_DOC = y.CVE_DOC
WHERE     (y.STATUS <> 'C') AND (z.APAR <> 0)
GROUP BY z.CVE_ART, z.CANT

consulta individual: OK
Código SQL [-]
SELECT DISTINCT a.CVE_ART, b.DESCR, a.EXIST AS EXISTENCIA, c.PRECIO
FROM         MULT02 AS a LEFT OUTER JOIN
                      INVE02 AS b ON a.CVE_ART = b.CVE_ART LEFT OUTER JOIN
                      PRECIO_X_PROD02 AS c ON a.CVE_ART = c.CVE_ART LEFT OUTER JOIN
                      PAR_FACTP02 AS d ON a.CVE_ART = d.CVE_ART LEFT OUTER JOIN
                      FACTP02 AS e ON d.CVE_DOC = e.CVE_DOC
WHERE     (e.STATUS <> 'C') AND (a.CVE_ALM = 1) AND (c.CVE_PRECIO = 1) AND (a.EXIST <> 0)
ORDER BY a.CVE_ART

como les mencione funcionan bien, pero no he logrado enlazar el resultado de una y restarle el de la otra.

Alguien que se le ocurra el origen del problema.

Gracias & saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Resta Hexadecimal ??? Ðαяισš Varios 6 15-09-2010 11:34:17
Resta de tiempo Faust SQL 4 25-04-2008 18:31:54
REsta Fechas Juanito-Kun Firebird e Interbase 2 11-10-2005 20:52:23
Resta equivocada... jhonny Varios 6 26-09-2005 18:43:20
Resta de Tablas con SQL agova SQL 8 24-11-2003 21:20:25


La franja horaria es GMT +2. Ahora son las 05:51:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi