diff --git a/docs/sql/cedlab_Chart_AllSeriesV2.sql b/docs/sql/cedlab_Chart_AllSeriesV2.sql index 3e4cd45..2eee2a2 100644 --- a/docs/sql/cedlab_Chart_AllSeriesV2.sql +++ b/docs/sql/cedlab_Chart_AllSeriesV2.sql @@ -6,51 +6,46 @@ GO -- Restituisce tutte le serie (CTF + tutti UL) in un unico round-trip. -- Usata da ChartDataServiceV2 per il grafico V2. -- --- Logica UL: identica a cedlab_Chart_DailyUL1, estesa a tutti i --- sottostanti del certificato tramite INNER JOIN su dbo.Underlyings. +-- Logica basata su: +-- - cedlab_Chart_DailyUL1: stessa formula performance UL, stessi filtri +-- - cedlab_Chart_UL1: Strike da CertificatesUnderlyings, StartDate = MIN(Prices.Px_date) -- --- Output (ordinato IDUnderlyings ASC, Px_date ASC): +-- Output (IDUnderlyings ASC, Px_date ASC): -- IDUnderlyings INT -- 0 = CTF, altrimenti UnderlyingsID -- Px_date DATE -- Performance DECIMAL -- % su strike/nominal --- --- Note: cedlab_Chart_UL1 già restituisce tutti i campi metadata --- (IsWorstOf, PriceWorst, Barriere, NomeCFT, ecc.) — non serve una nuova SP. -- ============================================================ CREATE OR ALTER PROCEDURE [dbo].[cedlab_Chart_AllSeriesV2] - @isin NVARCHAR(12) + @isin VARCHAR(15) AS BEGIN SET NOCOUNT ON; - -- Recupera IDCertificates DECLARE @IDCertificates INT; DECLARE @Nominal DECIMAL(18, 6); + DECLARE @StartDate DATE; SELECT TOP 1 - @IDCertificates = p.CertificatesID - FROM dbo.Prices p - INNER JOIN dbo.Certificates c ON c.IDCertificates = p.CertificatesID -- <<< verify: tabella e colonna ISIN in Certificates - WHERE c.ISIN = @isin - AND p.PX_LAST_EOD IS NOT NULL - AND p.PX_LAST_EOD <> 0; - - -- Nominal per calcolo performance CTF: adatta se usi un'altra colonna - SELECT TOP 1 - @Nominal = c.Nominal_amount -- <<< verify: colonna nominale in Certificates + @IDCertificates = c.IDCertificates, + @Nominal = c.Nominal_amount FROM dbo.Certificates c - WHERE c.IDCertificates = @IDCertificates; + WHERE c.ISIN = @isin; IF @IDCertificates IS NULL RETURN; - -- ── CTE: TOP 350 per-serie, poi reinverte in ASC ─────────────────── + -- StartDate = prima data di prezzi EOD del certificato + -- (identica a cedlab_Chart_UL1: MIN(p.Px_date) con join su Prices) + SELECT @StartDate = MIN(p.Px_date) + FROM dbo.Prices p + WHERE p.CertificatesID = @IDCertificates; + + -- ── CTE: TOP 350 per-serie tramite ROW_NUMBER DESC, poi reinverte ASC ── WITH AllSeriesRaw AS ( -- ── Serie CTF (IDUnderlyings = 0) ──────────────────────────────── - -- Performance = PX_LAST_EOD / Nominal * 100 - -- (stessa logica di cedlab_Chart_DailyCTF) - SELECT TOP 350 + -- Performance = PX_LAST_EOD / Nominal_amount * 100 + SELECT 0 AS IDUnderlyings, pc.Px_date, CONVERT(DECIMAL(18, 4), @@ -68,10 +63,10 @@ BEGIN UNION ALL -- ── Serie UL (tutti i sottostanti del certificato) ──────────────── - -- Performance = (Px_close o Px_closeadj) / Strike * 100 - -- Identica a cedlab_Chart_DailyUL1 ma per TUTTI gli UL in un colpo. - -- Date allineate al CTF (INNER JOIN su Px_date). - SELECT TOP 350 + -- Identica a cedlab_Chart_DailyUL1 per ogni UL attivo. + -- Strike da CertificatesUnderlyings (come in cedlab_Chart_UL1). + -- Date allineate al CTF (INNER JOIN su Prices per CertificatesID). + SELECT pu.UnderlyingsID AS IDUnderlyings, pu.Px_date, CONVERT(DECIMAL(18, 4), @@ -79,7 +74,7 @@ BEGIN WHEN ISNULL(u.AdjustedPrices, 0) = 0 THEN pu.Px_close ELSE pu.Px_closeadj END - / NULLIF(u.Strike, 0) * 100 + / NULLIF(cu.Strike, 0) * 100 ) AS Performance, ROW_NUMBER() OVER ( PARTITION BY pu.UnderlyingsID @@ -88,18 +83,23 @@ BEGIN FROM dbo.Prices pu LEFT JOIN dbo.Underlyings u ON u.IDUnderlyings = pu.UnderlyingsID + INNER JOIN dbo.CertificatesUnderlyings cu + ON cu.UnderlyingsID = pu.UnderlyingsID + AND cu.CertificatesID = @IDCertificates -- Allinea date UL al CTF (solo date con prezzo CTF valido) INNER JOIN dbo.Prices pc - ON pu.Px_date = pc.Px_date + ON pu.Px_date = pc.Px_date AND pc.CertificatesID = @IDCertificates - AND pc.PX_LAST_EOD IS NOT NULL - AND pc.PX_LAST_EOD <> 0 - WHERE u.IDCertificates = @IDCertificates + AND pc.PX_LAST_EOD IS NOT NULL + AND pc.PX_LAST_EOD <> 0 + WHERE cu.deleted = 0 + AND u.deleted = 0 + AND u.sospeso = 0 AND ( pu.px_low IS NOT NULL OR pu.Px_high IS NOT NULL OR pu.Px_open IS NOT NULL OR pu.Px_close IS NOT NULL ) - AND pu.px_date >= u.StartDate -- <<< verify: colonna StartDate in Underlyings + AND pu.px_date >= @StartDate ) SELECT