Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Resta de dos Querys (https://www.clubdelphi.com/foros/showthread.php?t=87604)

Jose Carlos Rey 29-01-2015 18:14:09

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.

TOPX 29-01-2015 18:22:35

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.

-

Jose Carlos Rey 29-01-2015 19:08:58

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

aposi 29-01-2015 20:07:16

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

Jose Carlos Rey 29-01-2015 20:49:46

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

aposi 29-01-2015 21:34:54

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)

Jose Carlos Rey 30-01-2015 15:39:06

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

:D

Gracias & saludos

Jose Carlos Rey 30-01-2015 18:54:51

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


La franja horaria es GMT +2. Ahora son las 06:50:07.

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