USE [FirstSolutionDB] GO -- ============================================================ -- SP: cedlab_Chart_AllSeriesV2 -- 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. -- -- Output (ordinato 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) AS BEGIN SET NOCOUNT ON; -- Recupera IDCertificates DECLARE @IDCertificates INT; DECLARE @Nominal DECIMAL(18, 6); 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 FROM dbo.Certificates c WHERE c.IDCertificates = @IDCertificates; IF @IDCertificates IS NULL RETURN; -- ── CTE: TOP 350 per-serie, poi reinverte in ASC ─────────────────── WITH AllSeriesRaw AS ( -- ── Serie CTF (IDUnderlyings = 0) ──────────────────────────────── -- Performance = PX_LAST_EOD / Nominal * 100 -- (stessa logica di cedlab_Chart_DailyCTF) SELECT TOP 350 0 AS IDUnderlyings, pc.Px_date, CONVERT(DECIMAL(18, 4), pc.PX_LAST_EOD / NULLIF(@Nominal, 0) * 100 ) AS Performance, ROW_NUMBER() OVER ( PARTITION BY 0 ORDER BY pc.Px_date DESC ) AS rn FROM dbo.Prices pc WHERE pc.CertificatesID = @IDCertificates AND pc.PX_LAST_EOD IS NOT NULL AND pc.PX_LAST_EOD <> 0 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 pu.UnderlyingsID AS IDUnderlyings, pu.Px_date, CONVERT(DECIMAL(18, 4), CASE WHEN ISNULL(u.AdjustedPrices, 0) = 0 THEN pu.Px_close ELSE pu.Px_closeadj END / NULLIF(u.Strike, 0) * 100 ) AS Performance, ROW_NUMBER() OVER ( PARTITION BY pu.UnderlyingsID ORDER BY pu.Px_date DESC ) AS rn FROM dbo.Prices pu LEFT JOIN dbo.Underlyings u ON u.IDUnderlyings = pu.UnderlyingsID -- Allinea date UL al CTF (solo date con prezzo CTF valido) INNER JOIN dbo.Prices pc 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 ( 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 ) SELECT IDUnderlyings, Px_date, Performance FROM AllSeriesRaw WHERE rn <= 350 ORDER BY IDUnderlyings ASC, Px_date ASC; END GO