Vero, dovevo pensarci subito ... quindi provvedo:
/****** Oggetto: Table [dbo].[VSTATBOLLEVENDITA] Data script: 04/21/2008 08:47:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[VSTATBOLLEVENDITA](
[ARTICOLO] [char](30) NULL,
[PESOQTAVENDUTA] [decimal](18, 8) NULL,
[DATAPROT] [char](8) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART01', 100000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART02', 90000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART03', 88000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART04', 80000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART05', 60000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART06', 20000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART07', 8000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART08', 6000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART09', 3000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART10', 1000, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART11', 500, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART12', 200, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART13', 100, '20080103')
INSERT INTO VSTATBOLLEVENDITA(ARTICOLO, PESOQTAVENDUTA, DATAPROT)
VALUES ('ART14', 50, '20080103')
GO
/****** Oggetto: StoredProcedure [dbo].[STPStatClassificazioneABCPesoVenduto] Data script: 04/17/2008 11:49:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Mauro Branca>
-- Create date: <20080417>
-- Description: <classificazione ABC degli articoli in base>
-- <al peso venduto negli ultimi n mesi>
-- =============================================
CREATE PROCEDURE [dbo].[STPStatClassificazioneABCPesoVenduto]
@CLASSEA DECIMAL(18, 8) = 0.8,
@CLASSEB DECIMAL(18, 8) = 0.15,
@NUMEROMESI INTEGER = 37
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @PESORIF FLOAT;
SELECT
BV.ARTICOLO, CAST(SUM(BV.PesoQTAVenduta) AS INTEGER) AS PESOTOT
INTO #T
FROM
VSTATBOLLEVENDITA BV
WHERE
BV.DATAPROT >= CONVERT(CHAR(8), DATEADD(MM, -@NUMEROMESI, GETDATE()), 112)
GROUP BY
BV.ARTICOLO
SELECT @PESORIF = SUM(PESOTOT) FROM #T
SELECT
IDENTITY(INT, 1, 1) AS ID, #T.ARTICOLO, #T.PESOTOT, CAST(#T.PESOTOT / @PESORIF AS DECIMAL(18, 8)) AS PESOPERC
INTO
#T1
FROM
#T
ORDER BY
#T.PESOTOT DESC
SELECT
ID, ARTICOLO, PESOTOT, PESOPERC, PERCABC,
CASE
WHEN PERCABC <= @CLASSEA THEN 'A'
WHEN PERCABC > @CLASSEA AND PERCABC <= @CLASSEA + @CLASSEB THEN 'B'
ELSE 'C'
END AS ABC
FROM
(
SELECT
TA.ID, TA.ARTICOLO, TA.PESOTOT, TA.PESOPERC, SUM(TB.PESOPERC) AS PERCABC
FROM
#T1 AS TA
INNER JOIN #T1 AS TB
ON TA.ID >= TB.ID
GROUP BY
TA.ID, TA.ARTICOLO, TA.PESOTOT, TA.PESOPERC
) AS T2
DROP TABLE #T
DROP TABLE #T1
END
GO
GO
/****** Oggetto: UserDefinedFunction [dbo].[fStatClassificazioneABCPesoVenduto] Data script: 04/17/2008 11:50:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Mauro Branca>
-- Create date: <20080417>
-- Description: <classificazione ABC degli articoli in base>
-- <al peso venduto negli ultimi n mesi>
-- =============================================
CREATE FUNCTION [dbo].[fStatClassificazioneABCPesoVenduto]
(
@CLASSEA DECIMAL(18, 8) = 0.8,
@CLASSEB DECIMAL(18, 8) = 0.15,
@NUMEROMESI INTEGER = 37
)
RETURNS @T TABLE
(
ID INTEGER,
ARTICOLO CHAR(30),
PESOTOT INTEGER,
PESOPERC DECIMAL(18, 8),
PERCABC DECIMAL(18, 8),
ABC CHAR
)
AS
BEGIN
DECLARE @PESORIF AS DECIMAL(18, 8)
DECLARE @ID AS INTEGER
INSERT INTO @T(ID, ARTICOLO, PESOTOT, PESOPERC, PERCABC, ABC)
SELECT
0 AS ID, BV.ARTICOLO, CAST(SUM(BV.PesoQTAVenduta) AS INTEGER) AS PESOTOT, CAST(0 AS DECIMAL(18, 8)) AS PESOPERC, CAST(0 AS DECIMAL(18, 8)) AS PERCABC, ' ' AS ABC
FROM
VSTATBOLLEVENDITA BV
WHERE
BV.DATAPROT >= CONVERT(CHAR(8), DATEADD(MM, -@NUMEROMESI, GETDATE()), 112)
GROUP BY
BV.ARTICOLO
SELECT @PESORIF = SUM(PESOTOT) FROM @T
SET @ID = 1
WHILE EXISTS(SELECT TOP 1 * FROM @T WHERE ID = 0) BEGIN
UPDATE
@T
SET
ID = @ID,
PESOPERC = CAST(PESOTOT AS DECIMAL(18, 8)) / @PESORIF--) AS DECIMAL(18, 8))
WHERE
ARTICOLO = (SELECT TOP 1 ARTICOLO FROM @T WHERE ID = 0 ORDER BY PESOTOT DESC)
SET @ID = @ID + 1
END
UPDATE
@T
SET
PERCABC = T2.PERCABC,
ABC =
CASE
WHEN T2.PERCABC <= @CLASSEA THEN 'A'
WHEN T2.PERCABC <= @CLASSEA + @CLASSEB THEN 'B'
ELSE 'C'
END
FROM
@T T
INNER JOIN
(
SELECT
TA.ID, TA.ARTICOLO, TA.PESOTOT, TA.PESOPERC, SUM(TB.PESOPERC) AS PERCABC
FROM
@T AS TA
INNER JOIN @T AS TB
ON TA.ID >= TB.ID
GROUP BY
TA.ID, TA.ARTICOLO, TA.PESOTOT, TA.PESOPERC
) AS T2
ON T.ID = T2.ID
RETURN
END
GO
-- caso 1
EXEC STPStatClassificazioneABCPesoVenduto
-- caso 2
SELECT * FROM fstatclassificazioneABCPesoVenduto(default, default, default)
Note: 1. non ho stabilito un database (uno qualunque dei vostri temporanei dovrebbe andare bene)
2: la tabella vstatbollevendita non ha chiavi e/o indici (nel caso reale si tratta di una vista)
Mauro