Torna al Thread
USE tempdb;
GO
-- creazione e popolamento oggetti di esempio
CREATE TABLE dbo.Nominativi
(
CodiceNome int NOT NULL PRIMARY KEY CLUSTERED
, Cognome varchar(30) NOT NULL
, Nome varchar(30) NOT NULL
, Perc decimal(5,2) NOT NULL -- non usare real se puoi, è a virgola mobile e potresti trovarti arrotondamenti indesiderati
)
GO
INSERT INTO dbo.Nominativi (CodiceNome, Cognome, Nome, Perc)
VALUES
(1, 'Rossi', 'Mario', 25)
, (2, 'Verde', 'Roberto', 35)
, (3, 'Bianco', 'Remo', 22)
, (4, 'Giallo', 'Michele', 18)
GO
--
CREATE TABLE dbo.Provvigioni
(
CodiceProv int NOT NULL PRIMARY KEY CLUSTERED
, Causale varchar(100) NOT NULL
, Importo decimal(18,2) NOT NULL
)
GO
INSERT INTO dbo.Provvigioni (CodiceProv, Causale, Importo)
VALUES
(1, 'Ricavo per prestazione x', 1000)
, (2, 'Ricavo per prestazione y', 800)
, (3, 'Ricavo per prestazione z', 1500)
, (4, 'Ricavo per prestazione w', 700)
GO
--
CREATE TABLE dbo.Riparto
(
CodiceRip int IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED
, CodiceNome int NOT NULL
, Perc decimal(5, 2) NOT NULL
, ImpRip decimal(18,2) NOT NULL
)
GO
-- inserisco un codice nome per effettuare poi l'update
INSERT INTO dbo.Riparto (CodiceNome, ImpRip, Perc)
VALUES (3, 500, 100)
-- test dato aggiunto
SELECT * FROM dbo.Riparto
-- alla pressione del pulsante è sufficiente questo statement (SQL Server 2008 o successive, non 2000 o 2005):
-- seleziono la provvigione (si può parametrizzare tramite l'ausilio di stored procedure o quesry parametriche), uso la variabile solo a titolo di esempio
DECLARE @Provvigione int = 3
DECLARE @ImportoDaDividere decimal(18, 2)
SELECT @ImportoDaDividere = SUM(Importo) FROM dbo.Provvigioni WHERE CodiceProv = @Provvigione
MERGE dbo.Riparto DEST
USING dbo.Nominativi SORG
ON (SORG.CodiceNome = DEST.CodiceNome)
WHEN MATCHED THEN
UPDATE SET ImpRip = @ImportoDaDividere / 100 * SORG.Perc
WHEN NOT MATCHED THEN
INSERT (CodiceNome, Perc, ImpRip)
VALUES (SORG.CodiceNome, SORG.Perc, @ImportoDaDividere / 100 * SORG.Perc);
-- resultset finale
SELECT * FROM dbo.Riparto
DROP TABLE dbo.Nominativi
DROP TABLE dbo.Provvigioni
DROP TABLE dbo.Riparto
GO