Realizar varias acciones sobre una consulta

12/02/2004 - 12:28 por Mario Barro | Informe spam
Hola a todos;

Os espongo mi duda;

Cómo es posible en un procedimiento almacenado con parámetros de
entrada(filtros) y de salida(Output) y partir de una determinada consulta
entre fechas calcular y devolver las siguientes cuestiones de forma óptima.

1) Devolver todos los registros con sus campos correspondientes a partir de
un "select .".
2) Calcular funciones de agregación sobre dicha consulta, es decir, calcular
SUM(campo), MIN(campo), etc
3) Calcular otros valores totalizadores sobre dichos datos, pero que ademas
añaden algún filtro más a la consulta.

Es decir, la idea es realizar todos desde un procedimiento almacenado y que
devuelva las filas y los valores totalizadores calculados en parámetros de
entrada.
Todo ello sin tener que ejecutar cada vez la consulta para calcularlos.

Gracias y saludos

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
12/02/2004 - 13:51 | Informe spam
Hola,

Eso lo puedes hacer quizas con una sola consulta, no conozco bien las
estructuras y demas yerbas pero si se puede, ahora tambien podrias ver la
alternativa de funciones de usuario, estas quizas tambien te sean utiles.

un Store que retorna un select seria algo asi como


Create proc maxi123 @pais varchar(50) as
Select * from customers where country=@pais
GO

Salu2


Maximiliano Damian Accotto

"Mario Barro" escribió en el mensaje
news:
Hola a todos;

Os espongo mi duda;

Cómo es posible en un procedimiento almacenado con parámetros de
entrada(filtros) y de salida(Output) y partir de una determinada consulta
entre fechas calcular y devolver las siguientes cuestiones de forma


óptima.

1) Devolver todos los registros con sus campos correspondientes a partir


de
un "select .".
2) Calcular funciones de agregación sobre dicha consulta, es decir,


calcular
SUM(campo), MIN(campo), etc
3) Calcular otros valores totalizadores sobre dichos datos, pero que


ademas
añaden algún filtro más a la consulta.

Es decir, la idea es realizar todos desde un procedimiento almacenado y


que
devuelva las filas y los valores totalizadores calculados en parámetros de
entrada.
Todo ello sin tener que ejecutar cada vez la consulta para calcularlos.

Gracias y saludos


Respuesta Responder a este mensaje
#2 Javier Loria
12/02/2004 - 15:18 | Informe spam
Hola Mario:
Si es posible, y recomendable, hacer lo que deseas porque evita que la
estacion y al servidor estar comunicandose de forma innecesaria:
Tal vez con un ejemplo puedes verlo mejor, asumamos que quieres una
lista de todas las ventas en Order Details en Northwind de un producto en
particular, que necesitas el Precio Minimo y Maximo de dicho producto como
parametros y que se agregue como una fila adicional al conjunto de datos con
la venta promedio.
Esto pudes construirlo como:
=CREATE PROCEDURE VentasProducto
@Producto int,
@PrecioMaximo money OUTPUT,
@PrecioMinimo money OUTPUT
AS
Devuelve un conjunto de Datos
SELECT OrderID, ProductID, UnitPrice, Quantity, Discount
FROM [Order Details]
WHERE ProductID=@Producto
Agrega Filas as Conjunto de Datos
UNION ALL
SELECT NULL, 11,
SUM(UnitPrice*Quantity)/SUM(Quantity),
SUM(Quantity)/COUNT(*),
SUM(UnitPrice*Quantity*Discount)/SUM(UnitPrice*Quantity)
FROM [Order Details]
WHERE ProductID=@Producto
Asigna Valores como parametros
SELECT @PrecioMaximo=MAX(UnitPrice)
, @PrecioMinimo=MIN(UnitPrice)
FROM [Order Details]
WHERE ProductID=@Producto
=Para probarlo puedes usar:
ÞCLARE @PrecioMinimo DECIMAL
DECLARE @PrecioMaximo DECIMAL
EXEC VentasProducto 11, @PrecioMaximo OUTPUT, @PrecioMinimo OUTPUT
SELECT @PrecioMinimo, @PrecioMaximo
=
Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Mario Barro escribio:
Hola a todos;

Os espongo mi duda;

Cómo es posible en un procedimiento almacenado con parámetros de
entrada(filtros) y de salida(Output) y partir de una determinada
consulta entre fechas calcular y devolver las siguientes cuestiones
de forma óptima.

1) Devolver todos los registros con sus campos correspondientes a
partir de un "select .".
2) Calcular funciones de agregación sobre dicha consulta, es decir,
calcular SUM(campo), MIN(campo), etc
3) Calcular otros valores totalizadores sobre dichos datos, pero que
ademas añaden algún filtro más a la consulta.

Es decir, la idea es realizar todos desde un procedimiento almacenado
y que devuelva las filas y los valores totalizadores calculados en
parámetros de entrada.
Todo ello sin tener que ejecutar cada vez la consulta para
calcularlos.

Gracias y saludos
Respuesta Responder a este mensaje
#3 Adrian D. Garcia
13/02/2004 - 01:09 | Informe spam
Existen las clausulas ROLLUP y CUBE en la sentencia SELECT en el T-SQL.
Aqui va un ejemplo sacado de los BOL:

Dado la siguiente tabla:
Item Color Quantity
Table Blue 124
Table Red 223
Chair Blue 101
Chair Red 210

Al ejecutar la siguiente sentencia
SELECT Item, Color, SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH CUBE
Obtienes:

Item Color QtySum
Chair Blue 101.00
Chair Red 210.00
Chair (null) 311.00
Table Blue 124.00
Table Red 223.00
Table (null) 347.00
(null) (null) 658.00
(null) Blue 225.00
(null) Red 433.00 Ademas del SUM puedes
utilizar cualquier funcion de aqrupacion y tambien definir los filtros que
quieres a nivel de filas (WHERE...) y a nivel de grupos (HAVING...)

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Mario Barro" wrote in message
news:
Hola a todos;

Os espongo mi duda;

Cómo es posible en un procedimiento almacenado con parámetros de
entrada(filtros) y de salida(Output) y partir de una determinada consulta
entre fechas calcular y devolver las siguientes cuestiones de forma


óptima.

1) Devolver todos los registros con sus campos correspondientes a partir


de
un "select .".
2) Calcular funciones de agregación sobre dicha consulta, es decir,


calcular
SUM(campo), MIN(campo), etc
3) Calcular otros valores totalizadores sobre dichos datos, pero que


ademas
añaden algún filtro más a la consulta.

Es decir, la idea es realizar todos desde un procedimiento almacenado y


que
devuelva las filas y los valores totalizadores calculados en parámetros de
entrada.
Todo ello sin tener que ejecutar cada vez la consulta para calcularlos.

Gracias y saludos


Respuesta Responder a este mensaje
#4 Mario Barro
13/02/2004 - 10:12 | Informe spam
Gracias por tu ayuda
Lo que comentas es la idea que necesito, pero aún voy a ir más fino.

Supongamos que la sentencia Select es costosa de realizar porque la tabla
tiene muchos registros.

Y el caso es que los valores (SUM, MIN, etc) son realizados también sobre
esa misma consulta inicial y con los mismos filtros.

Mi pregunta es, si se tiene que volver a realizar la consulta por cada valor
de agregación que necesitásemos calcular, es decir, poder reutilizar los
datos devueltos del primer "select" para luego realizar las posteriores
consultas sobre ellos en concreto y no sobre la bbdd otra vez.

Es decir algo como

MisDatosDevueltos = Select .from MiTabla where
..Misfiltros

select @Total = SUM (Precio) from MisDatosDevueltos

Y no tener que hacer:
select @Total = SUM(Precio) from MiTabla Where .. MisFiltros

Donde MisFiltros son iguales en los dos casos.

Espero se entienda lo expresado.

Saludos
Respuesta Responder a este mensaje
#5 Javier Loria
13/02/2004 - 15:51 | Informe spam
Hola Mario:
No creo que exista lo que quieres exactamente.
Puedes usar COMPUTE que devuelde los datos en conjuntos de datos
separarados y no como parametros:
SELECT OrderID, ProductID, UnitPrice, Quantity, Discount,
UnitPrice*Quantity*(1-Discount) AS Total
FROM [Order Details]
WHERE ProductID
COMPUTE MIN(UnitPrice), MAX(UnitPrice), SUM(UnitPrice*Quantity*(1-Discount))

La unica forma de "reutilizar" los datos del primer select es grabarlos
en una tabla temporal o en una variable tipo tabla. Y a menos que la
consulta se vaya a utilizar muchas veces en el mismo procedimiento y que sea
muy lenta, no te lo recomiendo esta tecnica.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Mario Barro escribio:
Gracias por tu ayuda
Lo que comentas es la idea que necesito, pero aún voy a ir más fino.

Supongamos que la sentencia Select es costosa de realizar porque la
tabla tiene muchos registros.

Y el caso es que los valores (SUM, MIN, etc) son realizados también
sobre esa misma consulta inicial y con los mismos filtros.

Mi pregunta es, si se tiene que volver a realizar la consulta por
cada valor de agregación que necesitásemos calcular, es decir, poder
reutilizar los datos devueltos del primer "select" para luego
realizar las posteriores consultas sobre ellos en concreto y no sobre
la bbdd otra vez.

Es decir algo como

MisDatosDevueltos = Select .from MiTabla where
..Misfiltros

select @Total = SUM (Precio) from MisDatosDevueltos

Y no tener que hacer:
select @Total = SUM(Precio) from MiTabla Where .. MisFiltros

Donde MisFiltros son iguales en los dos casos.

Espero se entienda lo expresado.

Saludos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida