cancel
Showing results for 
Search instead for 
Did you mean: 

Ayuda!¿Como uno estas dos consultas?

Former Member
0 Kudos

Buenas tardes a tod@s,

me gustaría pediros ayuda y para eso se que es muy importante explicaros bien el problema, así que espero hacerlo lo mejor posible.

Tengo que dos consultas que por separado funcionan perfectamente, pero no se como ejecutarlas de manera conjunta.

La situación es la siguiente: en la CONSULTA1 se obtienen un conjunto de información de TODAS las ofertas que reunen una serie de requisitos. En la CONSULTA2 se realiza el cálculo de dos fórmulas para UNA única oferta introducida como parámetro cuando se ejecuta la consulta.

El problema está en que no se como conseguir que el resultado de la CONSULTA1 (todas las ofertas) incluya dos nuevas columnas con el cálculo de las fórmulas de la CONSULTA2. ¿Me entendeis?

Estas son las consultas:

CONSULTA1

SELECT
T0.DocNum as Oferta,
T1.SlpName as Comercial,
T2.Zipcode as CP,
T2.City as Poblacion
FROM
OQUT T0 LEFT JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode
LEFT JOIN CRD1 T2 ON T0.CardCode = T2.CardCode
WHERE
T0.Series = '613' and T2.Address LIKE 'FACTUR%'

CONSULTA2

SELECT
STR (Cuentas1.Neto/Cuentas1.Coste,10,3) as FMT,
STR (Cuentas2.Neto/Cuentas2.Coste,10,3) as FMO
FROM (
SELECT
sum(T1.LineTotal) as Neto,
sum(T1.GrossBuyPr*T1.Quantity) as Coste
FROM 
OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
WHERE 
T0.DocNum = '[%0]' and	T1.Itemcode not in ('10000025','99999999')
) as Cuentas1, 
(
SELECT
sum(T1.LineTotal) as Neto,
sum(T1.GrossBuyPr*T1.Quantity) as Coste
FROM 
OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
WHERE 
T0.DocNum = '[%0]' and T1.Itemcode ='10000025'
) as Cuentas2

Donde

[%0]

es la variable que utilizo en esta consulta para introducir la oferta manualmente al ejecutar la consulta.

¿Como puedo unir estas consultas para que en vez de tener que pasar la oferta como parámetro de una en una haga el cálculo para todas las resultantes a la vez de la CONSULTA1?

Si necesitais que amplie alguna información decidmelo.

Muchísimas gracias de antemano. Un saludo.

Accepted Solutions (1)

Accepted Solutions (1)

agustin_marcoscividanes
Active Contributor
0 Kudos

Hola

prueba este código


DECLARE @docnum as int
DECLARE @Comercial as VARCHAR(50)
DECLARE @CP AS VARCHAR(5)
DECLARE @Poblacion AS VARCHAR(50)
CREATE TABLE #calculos (DocNum int, SlpName VARCHAR(50), Zipcode VARCHAR(5), City VARCHAR(50), FMT  VARCHAR(20), FMO  VARCHAR(20))

DECLARE ofertas_cursor CURSOR FOR 

SELECT T0.DocNum as Oferta, T1.SlpName as Comercial, T2.Zipcode as CP, T2.City as Poblacion
FROM OQUT T0 LEFT JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode LEFT JOIN CRD1 T2 ON T0.CardCode = T2.CardCode
WHERE T0.Series = '613' and T2.Address LIKE 'FACTUR%'

OPEN ofertas_cursor;

FETCH NEXT FROM ofertas_cursor INTO @docnum, @Comercial, @CP, @Poblacion
WHILE @@FETCH_STATUS = 0
  BEGIN
  DECLARE @FMT as VARCHAR(20)
  DECLARE @FMO as vARCHAR(20)
  DECLARE calculos CURSOR FOR 
  SELECT STR (Cuentas1.Neto/Cuentas1.Coste,10,3) as FMT, STR (Cuentas2.Neto/Cuentas2.Coste,10,3) as FMO
	FROM ( SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM  OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode not in ('10000025','99999999')) as Cuentas1, 
	     (SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode ='10000025') as Cuentas2
   
  OPEN calculos;
  FETCH NEXT FROM calculos INTO @FMT, @FMO
  INSERT INTO #calculos VALUES (@docnum, @Comercial, @CP, @Poblacion, @FMT, @FMO)
  CLOSE calculos;
  DEALLOCATE calculos;
  END
CLOSE ofertas_cursor;
DEALLOCATE ofertas_cursor;

Former Member
0 Kudos

Hola Agustín, y gracias por tu rápida respuesta.

No se porqué, pero cuando pego tu consulta en mi Query Manager se me queda colgado SAP... ¿Es para usarla en el Query Manager? Es que necesito que la lancen ciertos usuarios.

Gracias de antemano y un saludo.

Álvaro.

agustin_marcoscividanes
Active Contributor
0 Kudos

Hola

yo la probé con el Query Manager para ver si daba algún error, y sintácticamente es correcta.

Funciona, a mí no me dio errores. Quizás dependa del volumen de datos que esté procesando. Podrías acotar el periodo de los documentos seleccionados para ver que hace y si el resultado es correcto.

OJO: en el copy paste me comí: select * from #calculos

Un saludo.

Agustín.

Edited by: Agustin Marcos Cividanes on Aug 12, 2011 4:44 PM

agustin_marcoscividanes
Active Contributor
0 Kudos

Hola

el código completo es:


DECLARE @docnum as int
DECLARE @Comercial as VARCHAR(50)
DECLARE @CP AS VARCHAR(5)
DECLARE @Poblacion AS VARCHAR(50)
CREATE TABLE #calculos (DocNum int, SlpName VARCHAR(50), Zipcode VARCHAR(5), City VARCHAR(50), FMT  VARCHAR(20), FMO  VARCHAR(20))
 
DECLARE ofertas_cursor CURSOR FOR 
 
SELECT T0.DocNum as Oferta, T1.SlpName as Comercial, T2.Zipcode as CP, T2.City as Poblacion
FROM OQUT T0 LEFT JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode LEFT JOIN CRD1 T2 ON T0.CardCode = T2.CardCode
WHERE T0.Series = '613' and T2.Address LIKE 'FACTUR%'
 
OPEN ofertas_cursor;
 
FETCH NEXT FROM ofertas_cursor INTO @docnum, @Comercial, @CP, @Poblacion
WHILE @@FETCH_STATUS = 0
  BEGIN
  DECLARE @FMT as VARCHAR(20)
  DECLARE @FMO as vARCHAR(20)
  DECLARE calculos CURSOR FOR 
  SELECT STR (Cuentas1.Neto/Cuentas1.Coste,10,3) as FMT, STR (Cuentas2.Neto/Cuentas2.Coste,10,3) as FMO
	FROM ( SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM  OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode not in ('10000025','99999999')) as Cuentas1, 
	     (SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode ='10000025') as Cuentas2
   
  OPEN calculos;
  FETCH NEXT FROM calculos INTO @FMT, @FMO
  INSERT INTO #calculos VALUES (@docnum, @Comercial, @CP, @Poblacion, @FMT, @FMO)
  CLOSE calculos;
  DEALLOCATE calculos;
  END
CLOSE ofertas_cursor;
DEALLOCATE ofertas_cursor;

select * from #calculos
drop #calculos

Un saludo

Agustí

Former Member
0 Kudos

Buenos días, y muchas gracias por vuestra ayuda!

Pero me temo que sigo sin resolver el problema:

- Agustín: tu consulta en mi query manager me da error: "Incorrect syntax near "#calculos" ¿Por qué?

- Floyola: he probado con UNION y con UNION ALL pero me da primero una única fila con el resultado de la CONSULTA2 y a continuación todas las filas resultantes de la CONSULTA1. En definitiva, que hace las consultas por separado y luego las une pero no las resuelve a la vez. ¿Como sería?

Sigo dándole vueltas.... ¿Alguna idea? Muchas gracias de nuevo.

Álvaro.

agustin_marcoscividanes
Active Contributor
0 Kudos

Hola


DECLARE @docnum as int
DECLARE @Comercial as VARCHAR(50)
DECLARE @CP AS VARCHAR(5)
DECLARE @Poblacion AS VARCHAR(50)
CREATE TABLE #calculos (DocNum int, SlpName VARCHAR(50), Zipcode VARCHAR(5), City VARCHAR(50), FMT  VARCHAR(20), FMO  VARCHAR(20))
 
DECLARE ofertas_cursor CURSOR FOR 
 
SELECT T0.DocNum as Oferta, T1.SlpName as Comercial, T2.Zipcode as CP, T2.City as Poblacion
FROM OQUT T0 LEFT JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode LEFT JOIN CRD1 T2 ON T0.CardCode = T2.CardCode
WHERE T0.Series = '613' and T2.Address LIKE 'FACTUR%'
 
OPEN ofertas_cursor;
 
FETCH NEXT FROM ofertas_cursor INTO @docnum, @Comercial, @CP, @Poblacion
WHILE @@FETCH_STATUS = 0
  BEGIN
  DECLARE @FMT as VARCHAR(20)
  DECLARE @FMO as vARCHAR(20)
  DECLARE calculos CURSOR FOR 
  SELECT STR (Cuentas1.Neto/Cuentas1.Coste,10,3) as FMT, STR (Cuentas2.Neto/Cuentas2.Coste,10,3) as FMO
	FROM ( SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM  OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode not in ('10000025','99999999')) as Cuentas1, 
	     (SELECT sum(T1.LineTotal) as Neto, sum(T1.GrossBuyPr*T1.Quantity) as Coste 
		FROM OQUT T0 INNER JOIN QUT1 T1 ON T0.DocEntry = T1.DocEntry
		WHERE T0.DocNum = @docnum and T1.Itemcode ='10000025') as Cuentas2
   
  OPEN calculos;
  FETCH NEXT FROM calculos INTO @FMT, @FMO
  INSERT INTO #calculos VALUES (@docnum, @Comercial, @CP, @Poblacion, @FMT, @FMO)
  CLOSE calculos;
  DEALLOCATE calculos;
  END
CLOSE ofertas_cursor;
DEALLOCATE ofertas_cursor;
 
select * from #calculos
drop table #calculos

Faltaba la palabra reservada TABLE en el drop.

Un saludo.

Agustin

Former Member
0 Kudos

Gracias a todos por vuestra colaboración.

Al final he resuelto la consulta con "San Crystal Report".

Cierro la pregunta, y gracias de nuevo a tod@s!

Answers (1)

Answers (1)

felipe_loyolarodriguez
Active Contributor
0 Kudos

Buenos dias estimado

Cuando trates de unir 2 consultas hay que tener algunas precauciones

1) Ambas consultas deben tener la misma cantidad de campos, ejemplo:


SELECT DocEntry, DocNum, DocDate, Doctotal
FROM OINV
UNION ALL
SELECT DocEntry, DocNum, DocDate, -Doctotal
FROM ORIN

Como puedes ver la consulta 1 tiene 4 campos y la consulta 2 tambien tiene 4 campos.

Cuando no puedas agregar mas campos porque no te sirven, puedes rellenar para que existan mas campos, ejemplo


SELECT DocEntry, DocNum, DocDate, DocDueDate, FolioNum, Doctotal, Comments, 
FROM OINV
UNION ALL
SELECT DocEntry, DocNum, DocDate, NULL, NULL, -Doctotal, Commenrs
FROM ORIN

Como vez en la consulta 2 para equiparar la cantidad de campos, agregue 2 campos NULL

2) Los campos de ambas columnas deben tener los el mismo tipo de datos, ejemplo:


SELECT DocEntry"INT", DocNum"INT", DocDate"DATE o NVARCHAR", Doctotal"INT"
FROM OINV
UNION ALL
SELECT DocEntry"INT", DocNum"INT", DocDate"DATE o NVARCHAR", Doctotal"INT"
FROM ORIN

Si la intentas por ejemplo asi, no resultara debido a que los 2 primeros campos tienen tipos de datos distintos.


SELECT DocDueDate"DATE O NVARCHAR", DocEntry, DocNum, DocDate, Doctotal
FROM OINV
UNION ALL
SELECT -DocTotal"INT",DocEntry, DocNum, DocDate, Comments
FROM ORIN

Una forma de corrigir esto es usando CONVERT para cambiar el tipo de datos a el correcto.

Como acotacion, al usar los operadores PIVOT, UNPIVOT, UNION, UNION ALL desaparecen las fechas link "Fechas naranjas"

Espero te sirva

Saludos

ezcuba
Discoverer
0 Kudos

hola

tengo dos Query que funcionan por separado, pero me gustaría que el resultado se fusione, lo intento con todo lo que leo en las redes, pero nada... me puedes ayudar....

------------- 1 -----------

SELECT T0."CardCode" AS "Codigo", T0."CardName", T1."DocEntry" AS "ID", T0."U_SII_NUMFAC" AS "FACTURA", T0."DocDate" AS "Fecha", T1."ItemCode", T1."Dscription", T1."Quantity", T1."PriceBefDi" AS "Precio", T1."VatSum" AS "IVA", T1."GPBefDisc", T1."DiscPrcnt" AS "Desc.", T1."Price" AS "Precio Desc.", T1."LineTotal", T1."PriceAfVAT" AS "Precio dp Desc.", T0."DocTotal"

FROM OINV T0 INNER JOIN INV1 T1 ON T0."DocEntry" = T1."DocEntry"

WHERE T0."CardCode" =[%0]

--------------------2--------------

SELECT T0."CardCode" AS "Codigo", T0."CardName", T1."DocEntry" AS "ID", T0."U_SII_NUMFAC" AS "FACTURA", T0."DocDate" AS "Fecha", T1."ItemCode", T1."Dscription", T1."Quantity", T1."PriceBefDi" AS "Precio", T1."VatSum" AS "IVA", T1."GPBefDisc", T1."DiscPrcnt" AS "Desc:", T1."Price", T1."LineTotal", T1."PriceAfVAT" AS "Precio Desc.", T0."DocTotal"

FROM ORIN T0 INNER JOIN RIN1 T1 ON T0."DocEntry" = T1."DocEntry"

WHERE T0."CardCode" =[%0]