Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [SQL] Uso di una SELF JOIN

    Ciao a tutti,
    ho una tabella "CONTI " così fatta:

    IDConto (CHIAVE - INT)
    Distinta (INT)
    Importo (NUMERIC)
    Tipo (SMALLINT - 1 = ord, 2 = ben)

    A seconda del "Tipo" sono memorizzati gli "Importi" o dell'ordinante o del beneficiario. Un esempio di dati è il seguente:

    IDConto - Distinta - Importo - Tipo
    ---------------------------------
    1 - 1 - 1000.00 - 1 (ord)
    2 - 1 - 500.00 - 2 (ben)
    3 - 1 - 250.00 - 2 (ben)
    4 - 1 - 250.00 - 2 (ben)

    Ad esempio "1000.00" dell'ordinante sono ripartiti su beneficiari diversi per un valore di: 500.00, 250.00, 250.00

    Devo fare una select che filtra sia gli importi degli ORD che dei BEN, in modo ad esempio che se inserico (1000.00, ord) mi restituisca solo il recordo numero 1, se invece inserisco anche un valore di importo dell'ordinante deve restituire anche quello/i. Ad esempio con (1000.00, ord) + (250.00, ben) devo avere i record 1,3,4

    Ho pensato di usare una SELF JOIN in questo modo, ma non mi da il risultato voluto:

    codice:
    SELECT   
    	ord.IDConto AS IDConto,
    	ord.Distinta AS Distinta,
    	ord.Importo AS Importo_ORD,
    	ord.Tipo AS Tipo_ORD,
    	ben.Importo AS Importo_BEN,
    	ben.Tipo AS Tipo_BEN
    
    FROM
    	Conti AS ord,
    	Conti AS ben
    
    WHERE
    	ord.Importo BETWEEN '1000.00' AND '1000.00'
    	AND
    	ord.Tipo = 1	
    	AND
    	ben.Importo BETWEEN '0' AND '9999.99'
    	AND
    	ben.Tipo = 2
    
    GROUP BY
    	ord.IDConto,
    	ord.Importo,
    	ord.Distinta,
    	ord.Tipo,
    	ben.Importo,
    	ben.Tipo
    E' la strada giusta la self join oppure devo usare qualche altro modo?

    GRAZIE
    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333

    Re: [SQL] Uso di una SELF JOIN

    Provo a ripetere quello che ho capito con dei punti di domanda:

    IDConto (CHIAVE - INT)
    ___è autoincrementale ???

    Distinta (INT)
    ___è il numero della operazione ??

    Importo (NUMERIC)
    ___la somma degli importi "ord" deve corrispondere alla somma degli importi "ben" ???????

    Tipo (SMALLINT - 1 = ord, 2 = ben)
    ___ puo assumere altri valori oltre che 1 o 2 ?????



    Originariamente inviato da Igor Baldacci
    IDConto - Distinta - Importo - Tipo
    ---------------------------------
    1 - 1 - 1000.00 - 1 (ord)
    2 - 1 - 500.00 - 2 (ben)
    3 - 1 - 250.00 - 2 (ben)
    4 - 1 - 250.00 - 2 (ben)

    Devo fare una select che filtra sia gli importi degli ORD che dei BEN, in modo ad esempio che se inserico (1000.00, ord) mi restituisca solo il recordo numero 1, se invece inserisco anche un valore di importo dell'ordinante deve restituire anche quello/i. Ad esempio con (1000.00, ord) + (250.00, ben) devo avere i record 1,3,4
    Scusami ma non ho capito la domanda
    Tu dici

    se inserico (1000.00, ord) mi restituisca .......
    se invece inserisco anche un valore di importo dell'ordinante ..........( ma questo è ancora il 1000 citato sopra )
    ???????
    __________________________________________________ ___________

    Prova a fare 2 esempi anche con i record che devono essere restituiti
    nei due casi,


    Saluti

  3. #3

    Re: Re: [SQL] Uso di una SELF JOIN

    Originariamente inviato da nman
    Provo a ripetere quello che ho capito con dei punti di domanda:

    IDConto (CHIAVE - INT)
    ___è autoincrementale ???
    SI E' AUTOINCREMENTANTE

    Distinta (INT)
    ___è il numero della operazione ??
    E' IL NUMERO DELL'OPERAZIONE, AD ESEMPIO:

    Distinta: 1
    Importo ORD: 100
    Importo BEN01: 50
    Importo BEN02: 25
    Importo BEN03: 25

    Quindi, per la stessa operazione, o distinta, numero 1, l'ordinante fa un importo di 100 ripartito sul 3 beneficiari, BEN01 che riceve l'importo 50, BEN02 che riceve l'importo 25 e BEN03 che riceve l'importo 25. Riassumendo quindi per la distina 1 (operazione 1) si ha che l'importo dell'ordinante è pari alla somma degli importi ricevuti dai beneficiari (100=50+25+25)

    Importo (NUMERIC)
    ___la somma degli importi "ord" deve corrispondere alla somma degli importi "ben" ???????
    SI, COME DETTO SOPRA L'IMPORTO PER QUELLA DISTINTA DEVE ESSERE PARI ALLA SOMMA DEI BEN PER QUELLA DISTINTA (QUINDI NON PER TUTTE LE DISTINTE)

    Tipo (SMALLINT - 1 = ord, 2 = ben)
    ___ puo assumere altri valori oltre che 1 o 2 ?????
    NO, SOLO 1 = ORD e 2 = BEN

    Scusami ma non ho capito la domanda
    Tu dici

    se inserico (1000.00, ord) mi restituisca .......
    se invece inserisco anche un valore di importo dell'ordinante ..........( ma questo è ancora il 1000 citato sopra )
    ???????
    SCUSAMI TU, CAPISCO DI ESSERE STATO POCO CHIARO. CERCHERO' DI FARMI CAPIRE MEGLIO:

    la mia select deve poter filtrare sia sull'importo degli ORD che dei BEN, quindi ad esempio con una tabella dati di questo tipo:

    ---------------------------------
    IDConto - Distinta - Importo - Tipo
    ---------------------------------
    1 - 1 - 1000.00 - 1 (ord)
    2 - 1 - 500.00 - 2 (ben)
    3 - 1 - 250.00 - 2 (ben)
    4 - 1 - 250.00 - 2 (ben)

    se inserisco: IMPORTO ORD = 1000.00 mi deve restituire il primo record: ID=1; DIstinta=1 (e tutti gli altri dati in anagrafica che qui ho omesso).

    se inserisco IMPORTO BEN = 250.00 mi deve restituire il record 3 e 4: (ID=3; Distinta=1) e (ID=4; Distinta=1)

    se inserisco IMPORTO ORD = 1000.00 AND IMPORTO BEN = 250.00 mi deve restituire i record 1, 3, 4.

    Altro esempio:

    ---------------------------------
    IDConto - Distinta - Importo - Tipo
    ---------------------------------
    1 - 1 - 1000.00 - 1
    2 - 1 - 500.00 - 2
    3 - 1 - 250.00 - 2
    4 - 1 - 250.00 - 2
    5 - 2 - 1500.00 - 1
    6 - 2 - 1000.00 - 2
    7 - 2 - 500.00 - 2

    ho aggiunto una seconda operazione (Distinta = 2).

    se inserisco IMPORTO ORD = 1000.00 deve restituire il record 1

    se inserisco IMPORTO BEN = 500.00 deve restituire i record 2, 7 (su distinte diverse quindi)


    SPERO DI ESSERE STATO CHIARO.

    TI RINGRAZIO PER LA TUA RISPOSTA, SE TI VIENE IN MENTE QUALCOSA TE NE SONO GRATO.

    CIAO
    Il mio ultimo libro:
    Giorni di Follia. Presenze inquietanti a Pescara.
    www.giornidifollia.it

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Nel tuo esempio avevi messo un "AND" al posto di "OR"
    poi avevi sdoppiato la tabella ma non avevi fatto il SELF JOIN


    __________________________________________________ _______________


    Comunque io non farei il SELF JOIN bensi:
    1°___ dalla tabella semplice
    2°___andrei a separare con delle formule " CASE WHEN END " i valori di ORD e BEN in funzione del Tipo
    3°___e poi andrei a filtrare direttamente su quelle colonne


    codice:
    SELECT 
       IDConto, 
       Distinta, 
       Tipo, 
       CASE WHEN Tipo = 1 THEN Importo END AS Importo_ORD, 
       CASE WHEN Tipo = 1 THEN 'ORD' END AS Tipo_ORD, 
       CASE WHEN Tipo = 2 THEN Importo END AS Importo_BEN, 
       CASE WHEN Tipo = 2 THEN 'BEN' END AS Tipo_BEN 
    FROM  
       dbo.conti 
    WHERE 
       (CASE WHEN Tipo = 1 THEN Importo END BETWEEN '1000.00' AND '1000.00') 
    OR 
       (CASE WHEN Tipo = 2 THEN Importo END BETWEEN '500.00' AND '500.00')


    Saluti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.