Subconsulta de un SP

Esta consulta más que para SAP B1 sería para Crystal, pero como no tenemos sección de Crystal Report. lo colocaré aquí…

Tengo un Store Procedure que me trae un total de 20 al final de las consultas. (es un mega query de SQL con un total de 1500 líneas de programación, calculos y demás que me acabo de fumar). El mismo ya me funciona a la perfección, realizando todos los calculos necesarios y lo tengo en un Crystal Report.

Pues bien, por la manera y los datos que me están pidiendo para el reporte tuve que armar el reporte principal y varios subreportes (aunque usen el mismo SP), para organizar diagramar y entregar la información en cada uno de los formatos que pidieron, todos en 1 solo reporte.

Para no seguirla alargando. En el reporte viene todo organizado por “Item Padre - Items Hijos” donde 1 padre puede tener de 1 a N artículos hijos (listas de materiales en módulo de producción), y adicional a esto las fórmulas pueden llegar a tener hasta 4 o 5 niveles de organización (por eso el query seccionando todo).

Ahorita ya me trae los calculos de pesos, cantidades de materia prima, costo individual, costo total de la materia prima, y demás. y eso está Perfecto.

Mi problema viene a que ahora la última sección del reporte quieren saber la cantidad de artículos padres, pero este SP original no me sirve porque en el campo de cantidad, se multiplica por X cantidad de veces que se tenga hijos (y que estos hijos pueden tener hasta 4 o 5 niveles así que es un exponencial de crecimiento).

¿Como se soluciona?, exactamente la misma consulta, pero solo seleccionando los campos de artículos padres, Suma de Cantidad, Suma de Pesos, Suma de Costos, agrupandolos por padre y sin traer ningún campo de Hijo… (así evito la duplicidad con los hijos al agrupar por padres). Pero…

¿Como hago ese select contra un SP?

en teoría necesitaría algo como

Select 
docnum,
articulo sap,
tipo,
descripcion,
scrap,
u_operacion,
u_area,
sum([Peso_real_desechado]) as [Peso_real_desechado],
sum([costo Scrap]) as [costo Scrap],
año,
semana

From dbo.[SP_MUY_FUMADO] ParametroAño, ParametroSemana

Pero obviamente no se puede pues los SP se corren:

Exec [SP_MUY_FUMADO]  Parametro1, Parametro2

¿Alguna idea?, o tendré que hacerme un segundo SP con la agrupación que necesito y eliminando los campos que no me sirven?

Es un poco dificil entender sin ver el codigo o al menos todos los campos que devuelve el SP, pero creo que en tu caso no me complicaría, y hago otro SP con los totales. Ahora si tienes un poco mas de tiempo la solución podría estar usando el OVER PARTITION, que te permite hacer sumas parciales de acuerdo a un criterio de campos. Algo asi:

Select sum(cantidad) OVER (PARTITION BY campo_item_padre),
........
From dbo.[SP_MUY_FUMADO] ParametroAño, ParametroSemana
1 me gusta

La consulta lo que devuelve al final son unos 20 campos, de los cuales para la segunda parte que necesito es justo la que tengo arriba.

Select 
docnum,
articulo sap,
tipo,
descripcion,
scrap,
u_operacion,
u_area,
sum([Peso_real_desechado]) as [Peso_real_desechado],
sum([costo Scrap]) as [costo Scrap],
año,
semana

From dbo.[SP_MUY_FUMADO] ParametroAño, ParametroSemana

Me llama la atención de tu respuesta que me pones que se puede hacer un

From dbo.[SP_MUY_FUMADO] ParametroAño, ParametroSemana

Pero cuando lo hago en SQL por ejemplo no me reconoce el SP como una tabla que pueda hacer un select
Igual y si. me puse a pensarlo anoche y si no puedo hacer un Select From SP, o hacer que el SP entre en una tabla temporal en una nueva consulta, lo mejor es rehacer el query agrupado y así es más rápido.

Solo quería saber si se podía hacer un “Select From Store Procedure Parametros.” o un Exec StoreProcedure Parametros, into TablaTemporal

1 me gusta

tienes razon, se me paso ese detalle, no puedes hacer join directamente con un SP, talvez usando la funcion Execute o OpenQuery, pero no estoy seguro.
Esto es una de la razones por lo que por lo general se usan mas las Table Faunctions, que si permiten usarlo en Join, podrias facilmente cambiar tu SP en Function, o tambien podrias, primero ejcutar tu SP y cargarlos en una tabla temporal, y luego haces tu query con la tabla temporal.

CREATE TABLE #Temp (
........
)

INSERT INTO #Temp
EXEC TheStoredProc

select ......
FROM #Temp
2 Me gusta

Bueno les comento… Al final me realicé un segundo SP que solamente trajera los campos que necesitaba, y listo.

Peeeero hoy me encontré con otra cosa. Resulta que tenía un SP que me trae el calculo de los KG de un material en específico de la empresa, que lo modifiqué un poco para que me trajera también el número de la semana y el año, y el SP anterior que provocó este tema, correspondía a los KG tirados de SCRAP en la empresa.

Bien, la dirección me pidió el viernes en la tarde que quería saber cuanto estaba Facturando Vs cuanto está Desechando en SCRAP, por semana, y que % representa. Tú mensaje me dió la idea de como solucionarlo, Pero para no almacenarlo en una temporal que debo estar borrando y si se me olvida o arroja algún error queda en memoria, lo solucioné HOY con algo de este estilo:

declare @Procedimiento1 table ( campo1  varchar(30),campo2 int... )
declare @Procedimiento2 table ( campoA  varchar(30),campoB int... )

insert into  @Procedimiento1
exec SP1 Parametro1, parametro2

insert into  @procedimiento2
exec SP2 Parametro1, parametro2

Select 
T0.Campo1,
T0.Campo2,
T1.CampoA,
SUM(T0.KG_Fact) as [KG Fact],
SUM(T1.KG_Scrap) as [KG Scrap],
((SUM(T1.KG_Scrap) * 100)/SUM(T0.KG_Fact)) as [Porcentaje]
From @Procedimiento1 T0
	Left Join @Procedimiento2 T1 on T0.XXX = T1.XXX 
	where ...
	group by ...

Muchas gracias por esa idea.

Este tema se cerró automáticamente 7 días después de la última publicación. No se permiten nuevas respuestas.