fix: use cedlab_Chart_UL2 (new SP, don't modify UL1); add correct SQL scripts with Prices table

This commit is contained in:
2026-05-27 16:28:26 +02:00
parent 44e2098584
commit a866a2f7d5
4 changed files with 297 additions and 2 deletions

View File

@@ -0,0 +1,102 @@
USE [FirstSolutionDB]
GO
-- ============================================================
-- SP: cedlab_Chart_UL2
-- Metadata dei sottostanti per il grafico V2.
-- NON modifica cedlab_Chart_UL1 (esistente, usata altrove).
--
-- Restituisce (ordinato IsWorstOf DESC, worst-of nella prima riga):
-- IDCertificates, IDUnderlyings, StartDate, Strike,
-- BarrieraCouponPerc, BarrieraCoupon,
-- BarrieraCapitalePerc, BarrieraCapitale,
-- Sottostante, IsWorstOf,
-- PriceWorst, PriceWorstPerc,
-- NumPrezziCFT, NomeCFT,
-- TriggerAutocallPerc, AutocallValue
--
-- Colonne con <<< verify: adatta al tuo schema reale.
-- ============================================================
CREATE OR ALTER PROCEDURE [dbo].[cedlab_Chart_UL2]
@isin NVARCHAR(12)
AS
BEGIN
SET NOCOUNT ON;
-- Recupera IDCertificates
DECLARE @IDCertificates INT;
SELECT TOP 1
@IDCertificates = c.IDCertificates -- <<< verify: colonna ID nel tuo Certificates
FROM [dbo].[Certificates] c -- <<< verify: nome tabella certificati
WHERE c.ISIN = @isin;
IF @IDCertificates IS NULL RETURN;
-- Conta prezzi EOD disponibili del certificato (usato per il sub-titolo "< 30 gg")
DECLARE @NumPrezziCFT INT;
SELECT @NumPrezziCFT = COUNT(*)
FROM dbo.Prices
WHERE CertificatesID = @IDCertificates
AND PX_LAST_EOD IS NOT NULL
AND PX_LAST_EOD <> 0;
SELECT
u.IDCertificates,
u.IDUnderlyings,
u.StartDate, -- <<< verify: colonna StartDate in Underlyings
u.Strike, -- <<< verify: colonna Strike in Underlyings
-- Barriere (% e assolute)
u.BarrieraCouponPerc, -- <<< verify: colonna % barriera coupon
u.BarrieraCoupon, -- <<< verify: colonna assoluta barriera coupon
u.BarrieraCapitalePerc, -- <<< verify: colonna % barriera capitale
u.BarrieraCapitale, -- <<< verify: colonna assoluta barriera capitale
u.Name AS Sottostante, -- <<< verify: colonna nome sottostante
u.IsWorstOf, -- <<< verify: colonna 1/0 worst-of in Underlyings
-- PriceWorst: ultimo Px_close per il worst-of (0 per gli altri)
CASE
WHEN u.IsWorstOf = 1 THEN ISNULL(lp.Px_close, 0)
ELSE 0
END AS PriceWorst,
-- PriceWorstPerc: PriceWorst / Strike * 100
CASE
WHEN u.IsWorstOf = 1 AND ISNULL(u.Strike, 0) > 0
THEN ISNULL(lp.Px_close, 0) / u.Strike * 100
ELSE 0
END AS PriceWorstPerc,
@NumPrezziCFT AS NumPrezziCFT,
-- NomeCFT: Descrizione + ' - ' + ISIN (adatta nomi colonne)
c.Descrizione + ' - ' + c.ISIN AS NomeCFT, -- <<< verify: colonne Descrizione e ISIN
ISNULL(u.TriggerAutocallPerc, 0) AS TriggerAutocallPerc, -- <<< verify
ISNULL(u.AutocallValue, 0) AS AutocallValue -- <<< verify
FROM dbo.Underlyings u
JOIN [dbo].[Certificates] c -- <<< verify
ON c.IDCertificates = u.IDCertificates
-- Ultimo prezzo disponibile per ogni sottostante (per PriceWorst)
LEFT JOIN (
SELECT
UnderlyingsID,
Px_close,
ROW_NUMBER() OVER (
PARTITION BY UnderlyingsID
ORDER BY Px_date DESC
) AS rn
FROM dbo.Prices
WHERE Px_close IS NOT NULL
) lp ON lp.UnderlyingsID = u.IDUnderlyings AND lp.rn = 1
WHERE u.IDCertificates = @IDCertificates
ORDER BY u.IsWorstOf DESC; -- worst-of nella prima riga
END
GO