on 08-12-2011 9:01 AM
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.
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;
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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í
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.
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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]
User | Count |
---|---|
93 | |
11 | |
11 | |
6 | |
6 | |
4 | |
3 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.