SP con una condizione IF ELSE

domenica 05 luglio 2009 - 14.21

luxsor Profilo | Guru

Ciao a tutti,
come posso creare una SP che vi restituisca un resulset tramite una condizione IF ELSE.
Vorrei ottenere questo:

Se [INDENNIZZO è DIRETTO ] paga l'assicurazione del veicolo che ha RAGIONE (ASSICURAZIONE VEICOLO A)
Se [INDENNIZZO è INDIRETTO ] paga l'assicurazione del che ha TORTO (ASSICURAZIONE VEICOLO B)

Posto la struttura del DB SQL Server:

USE [tempdb]
GO
/****** Oggetto: Table [dbo].[tempdb] Data script: 07/05/2009 14:05:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tempdb](
[idmodulo] [int] IDENTITY(1,1) NOT NULL,
[indennizzo] [nvarchar](50) NULL,
[veicoloragione] [nvarchar](50) NULL,
[assicurazioneveicoloa] [nvarchar](100) NULL,
[assicurazioneveicolob] [nvarchar](100) NULL,
CONSTRAINT [PK_tempdb] PRIMARY KEY CLUSTERED
(
[idmodulo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


INSERT INTO [tempdb].[dbo].[tempdb]
([indennizzo], [veicoloragione], [assicurazioneveicoloa] ,[assicurazioneveicolob])
VALUES
('DIRETTO','VEICOLO A','SARA ASSICURAZIONI','GENERALI')


INSERT INTO [tempdb].[dbo].[tempdb]
([indennizzo], [veicoloragione], [assicurazioneveicoloa] ,[assicurazioneveicolob])
VALUES
('INDIRETTO','VEICOLO A','SARA ASSICURAZIONI','GENERALI')


Grazie



------------------------
Luxsor

lbenaglia Profilo | Guru

>Vorrei ottenere questo:
>
>Se [INDENNIZZO è DIRETTO ] paga l'assicurazione del veicolo che
>ha RAGIONE (ASSICURAZIONE VEICOLO A)
>Se [INDENNIZZO è INDIRETTO ] paga l'assicurazione del che ha
>TORTO (ASSICURAZIONE VEICOLO B)

Qual è il result set che vuoi ottenere?

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

>>Vorrei ottenere questo:

>>Se [INDENNIZZO è DIRETTO ] paga l'assicurazione del veicolo che
>>ha RAGIONE (ASSICURAZIONE VEICOLO A)
>>Se [INDENNIZZO è INDIRETTO ] paga l'assicurazione del che ha
>>TORTO (ASSICURAZIONE VEICOLO B)

>Qual è il result set che vuoi ottenere?


ID | DIRETTO | SARA ASSICURAZIONI
ID | INDIRETTO | GENERALI

Grazie


------------------------
Luxsor

lbenaglia Profilo | Guru

>ID | DIRETTO | SARA ASSICURAZIONI
>ID | INDIRETTO | GENERALI

Puoi ricorrere all'espressione CASE:

USE tempdb; GO CREATE TABLE dbo.Moduli( idmodulo int IDENTITY(1,1) NOT NULL, indennizzo nvarchar(50) NULL, veicoloragione nvarchar(50) NULL, assicurazioneveicoloa nvarchar(100) NULL, assicurazioneveicolob nvarchar(100) NULL, CONSTRAINT PK_Moduli PRIMARY KEY CLUSTERED(idmodulo) ); INSERT dbo.Moduli VALUES (N'DIRETTO', N'VEICOLO A', N'SARA ASSICURAZIONI', N'GENERALI') , (N'INDIRETTO', N'VEICOLO A', N'SARA ASSICURAZIONI', N'GENERALI'); SELECT idmodulo , indennizzo , CASE indennizzo WHEN N'DIRETTO' THEN assicurazioneveicoloa ELSE assicurazioneveicolob END AS assicurazione FROM dbo.Moduli; /* Output: idmodulo indennizzo assicurazione ----------- ----------- ------------------- 1 DIRETTO SARA ASSICURAZIONI 2 INDIRETTO GENERALI (2 row(s) affected) */ DROP TABLE dbo.Moduli;

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

Ciao Lorenzo,
il problema è che se utilizzo il blocco CASE non ottengo quello di cui ho bisogno, perchè ci vorrebbere 2 blocchi CASE annidati.
Cioè:
Se il campo INDENNIZZO è DIRETTO, non sempre paga l'assicurazione del veicolo A, ma paga l'assicurazione del Veicolo che ha Ragione;

Quello che vorrei che facesse la mia query è questa condizione:

IF INDENNIZZO = "DIRETTO" THEN

IF VEICOLORAGIONE = "VEICOLO A" THEN
PAGA ASSICURAZIONE VEICOLO A
ELSE
PAGA ASSICURAZIONE VEICOLO B
END IF

ELSE

IF VEICOLORAGIONE = "VEICOLO A" THEN
PAGA ASSICURAZIONE VEICOLO B
ELSE
PAGA ASSICURAZIONE VEICOLO A
END IF

END IF

per ottenere questo resultset.

>idmodulo indennizzo assicurazione
>----------- ----------- -------------------
>1 DIRETTO SARA ASSICURAZIONI
>2 INDIRETTO GENERALI
>
>(2 row(s) affected)

Grazie e scusami per la spiegazione inadeguata.



------------------------
Luxsor

lbenaglia Profilo | Guru

>Quello che vorrei che facesse la mia query è questa condizione:
>
>IF INDENNIZZO = "DIRETTO" THEN
>
> IF VEICOLORAGIONE = "VEICOLO A" THEN
> PAGA ASSICURAZIONE VEICOLO A
> ELSE
> PAGA ASSICURAZIONE VEICOLO B
> END IF
>
>ELSE
>
> IF VEICOLORAGIONE = "VEICOLO A" THEN
> PAGA ASSICURAZIONE VEICOLO B
> ELSE
> PAGA ASSICURAZIONE VEICOLO A
> END IF
>
>END IF

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

GRANDE...


------------------------
Luxsor

luxsor Profilo | Guru

Ciao Lorenzo,
scusami se riapri il thread.
Ho provato ad includere nella WHERE un filtro ulteriore per la colonna Assicurazione:

SELECT
idmodulo
, indennizzo
, CASE
WHEN indennizzo = N'DIRETTO' AND veicoloragione = N'VEICOLO A' THEN assicurazioneveicoloa
WHEN indennizzo = N'DIRETTO' AND veicoloragione = N'VEICOLO B' THEN assicurazioneveicolob
WHEN indennizzo = N'INDIRETTO' AND veicoloragione = N'VEICOLO A' THEN assicurazioneveicolob
WHEN indennizzo = N'INDIRETTO' AND veicoloragione = N'VEICOLO B' THEN assicurazioneveicoloa
END AS assicurazione
FROM dbo.Moduli WHERE assicurazione = 'SARA ASSICURAZIONI'

ma mi genera la seguente eccezzione:
Il nome di colonna 'assicurazione' non è valido.

Cosa può essere? Grazie




------------------------
Luxsor

lbenaglia Profilo | Guru

>Cosa può essere?
L'errore è dovuto al fatto che hai specificato l'alias di colonna nella clausola WHERE, ma dato che il filtro viene applicato PRIMA del comando di SELECT in quel momento l'alias non identifica alcunché.
Per risolvere dovresti riscrivere l'intero comando CASE nella clausola WHERE:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

oppure ricorrere ad una banale tabella derivata (ad esempio tramite una CTE):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

luxsor Profilo | Guru

GRAZIE 1000 LORENZO


------------------------
Luxsor
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5