Ho una tabella che assomiglia a questo:SQL Server: aggregato condizionale;
Year Value
-----------------
2013 -0.0016
2014 -0.0001
2015 0.0025
2016 -0.0003
2017 0.0023
2018 0.0002
e ho bisogno di eseguire un aggregato condizionale che si traduce in una nuova colonna. Le condizioni sono le seguenti:
Se il valore è negativo, l'aggregazione inizia e non si arresta finché il valore non è positivo. Poi più nulla fino a quando il valore è di nuovo negativo ... Il risultato sarà simile a questa:
Year Value AggCol
2013 -0.0016 -0.0016
2014 -0.0001 -0.0017
2015 0.0025 0.0008
2016 -0.0003 -0.0003
2017 0.0023 0.002
2018 0.0002 0.0002
Questa UDF è così vicino come ho ottenuto:
create function dbo.fn(@cYear numeric, @rate float)
returns float
as
begin
declare @pYear numeric
declare @return float
set @pYear = @cYear - 1
set @return = (select
case
when Value < 0 and @rate > 0 then null
when Value < 0 then Value + @rate
else @rate
end
from Table1
where [year] = @pYear)
return @return
end
Sono ok con una risposta in C# se fosse più facile, preferisci SQL. Il problema con la funzione che ho realizzato è che devo essere in grado di prendere i risultati dalla riga precedente per aggiungere valore quando il valore è positivo.
Sono stato sveglio tutta la notte su qui alla ricerca di indizi e nessuna gioia ...
EDIT: Quindi, pensare di questi come valori CPI per l'anno da applicare per la bolletta del cellulare dal gestore ... Essi aumenterà la tua fattura solo dal CPI e non la diminuirà mai (se l'IPC è negativo) ... ma compenserà l'IPC negativo degli anni precedenti con l'IPC degli anni attuali se l'IPC dell'anno corrente è positivo (o la somma risulta in positivo) ...
Questo può o non può aiutare ma questa è la situazione lol.
Quale versione di SQL Server si sta utilizzando? –
È possibile eseguire questa operazione utilizzando una query in SQL Server, ma richiede CTE ricorsive. –
2012 e sto bene con CTE ... ho accesso dbo, quindi posso fare tutto il necessario. – user3486773