WITH Ordenar(Item, Descripcion, Abrev, Meses, Valor, Fecha) AS
(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,
MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor, '22/10/2009'
From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0
And year(oc.FechReg)=2009
And month(oc.FechReg)>7
Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)
SELECT * From Ordenar
PIVOT(sum(Valor) FOR Meses IN ([7],[8],[9])) AS P
Pero cuando quiero hacerlo en un Procedimiento Almacenado que me reciba los
parametros no me funciona:
ALTER PROCEDURE [dbo].[sp_PromXMeses]
@nvcFecha nvarchar(25),
@intAnio int,
@intMes0 int,
@intMes1 int,
@intMes2 int,
@intMes3 int
AS
BEGIN
WITH Ordenar(Item, Descripcion, Abrev, Cast(Meses), Valor, Fecha) AS
(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,
MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor, @nvcFecha
From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0
And year(oc.FechReg)=@intAnio
And month(oc.FechReg)>@intMes0
Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)
SELECT * From Ordenar
PIVOT(sum(Valor) FOR Meses IN ([@intMes1],[@intMes2],[@intMes3])) AS P
END
Me salen los siguientes errores:
Msg 8114, Level 16, State 1, Procedure sp_PromXMeses, Line 16
Error al convertir el tipo de datos nvarchar a int.
Msg 473, Level 16, State 1, Procedure sp_PromXMeses, Line 16
Se ha proporcionado el valor incorrecto "@intMes1" en el operador PIVOT.
Como haria ese Procedimiento, o en que me estoy equivocando??
No puedes usar variables en el IN (...) del PIVOT (si no ve equivoco).
Entonces podr�as usar sql din�mico.
A ver si esto te funciona:
------------------------------------
declare @sql nvarchar(max);
set @sql = N'
WITH Ordenar AS
(
SELECT
b.Item As Item, b.Descripcion As Descripcion, u.abrev As Abrev,
MONTH(oc.FechReg) AS Meses, avg(dc.CostoUnit) AS Valor,'+
@nvcFecha+ N' as Fecha
From
Bien b, DetalleOC dc, OrdenC oc, UnidadMedida u
Where
dc.CodBien = B.Codigo And B.Unidad = U.Codigo
And dc.CodOC=oc.Codigo And oc.Estado<>0
And year(oc.FechReg)= '+ cast(@intAnio as nvarchar) + N'
And month(oc.FechReg)>' + cast(@intMes0 as nvarchar) + N'
Group By
MONTH (oc.FechReg), B.Item, B.Descripcion, U.Abrev
)
SELECT * From Ordenar
PIVOT(sum(Valor) FOR Meses IN ([' +
cast(@intMes1 as nvarchar) + N'],[' +
cast(@intMes2 as nvarchar) + N'],[' +
cast(@intMes3 as nvarchar) + N'])) AS P'
exec sp_executesql @sql
------------------------------------
Saludos,
Carlos