104 lines
4.0 KiB
Transact-SQL
104 lines
4.0 KiB
Transact-SQL
USE [FirstSolutionDB]
|
|
GO
|
|
|
|
-- ============================================================
|
|
-- SP: cedlab_Chart_AllSeriesV2
|
|
-- Restituisce tutte le serie (CTF + 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 in un unico UNION ALL.
|
|
--
|
|
-- Output (ordinato IDUnderlyings ASC, Px_date ASC):
|
|
-- IDUnderlyings INT -- 0 = CTF, altrimenti UnderlyingsID
|
|
-- Px_date DATE
|
|
-- Performance DECIMAL -- % su strike/nominal
|
|
--
|
|
-- Colonne con <<< verify: adatta al tuo schema reale.
|
|
-- ============================================================
|
|
|
|
CREATE OR ALTER PROCEDURE [dbo].[cedlab_Chart_AllSeriesV2]
|
|
@isin NVARCHAR(12)
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE @IDCertificates INT;
|
|
DECLARE @Nominal DECIMAL(18, 6);
|
|
|
|
SELECT TOP 1
|
|
@IDCertificates = c.IDCertificates, -- <<< verify
|
|
@Nominal = c.Nominal_amount -- <<< verify: valore nominale per CTF %
|
|
FROM [dbo].[Certificates] c -- <<< verify: nome tabella certificati
|
|
WHERE c.ISIN = @isin;
|
|
|
|
IF @IDCertificates IS NULL RETURN;
|
|
|
|
-- ── CTE: calcola performance per ogni serie, TOP 350 per-serie ─────
|
|
WITH AllSeriesRaw AS
|
|
(
|
|
-- ── Serie CTF (IDUnderlyings = 0) ────────────────────────────────
|
|
-- Performance = PX_LAST_EOD / Nominal * 100
|
|
SELECT
|
|
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 (una per ogni sottostante) ──────────────────────────
|
|
-- Stessa logica di cedlab_Chart_DailyUL1, estesa a tutti gli UL.
|
|
-- Date allineate al CTF (INNER JOIN su Px_date).
|
|
SELECT
|
|
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 presenti nel certificato)
|
|
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 -- <<< verify: colonna FK in Underlyings
|
|
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
|
|
)
|
|
|
|
-- ── Filtra TOP 350 per serie e reinverte in ordine ASC ───────────────
|
|
SELECT
|
|
IDUnderlyings,
|
|
Px_date,
|
|
Performance
|
|
FROM AllSeriesRaw
|
|
WHERE rn <= 350
|
|
ORDER BY IDUnderlyings ASC, Px_date ASC;
|
|
|
|
END
|
|
GO
|