Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2000
    Messaggi
    60

    [MYSQL] somma proveniente da tabelle diverse

    Saluti a tutti, ho 3 tabelle:
    utenti -> (id, cognome, nome)
    prestazioni -> (id, id_utente, importo)
    pagamenti-> (id, id_utente, importo)

    vorrei ottenere una lista di tutti gli utenti con il cognome e relativo saldo (dato dalla differenza tra il totale delle prestazioni e il totale dei pagamenti).

    ho provato con la query più ovvia:

    codice:
    SELECT utenti.cognome, utenti.id, (Sum( prestazioni.importo )  - Sum( pagamenti.importo ) 
    ) AS saldo
    FROM utenti
    LEFT  JOIN prestazioni ON prestazioni.id_utente = utenti.id
    LEFT  JOIN pagamenti ON pagamenti.id_utente = utenti.id
    GROUP  BY utenti.id
    ma mi restituisce numeri errati (esempio: ho due prestazioni, ed un solo pagamento, allora mi somma due volte l'importo del pagamento).

    Dove sbaglio? Grazie in anticipo per l'aiuto!

  2. #2
    ma il pagamento non ha un riferimento alla prestazione?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2000
    Messaggi
    60
    Quote Originariamente inviata da optime Visualizza il messaggio
    ma il pagamento non ha un riferimento alla prestazione?
    no, perchè non sono correlati tra loro se non tramite l'utente;

    per ogni utente posso registrare n prestazioni mensili, così come fare n pagamenti periodici.

  4. #4
    Ciao,

    potresti definirti sue subquery :

    1) somma del dovuto per ogni id_utente prendendo in considerazione solo la tab prestazioni
    2) somma del pagato per ogni id_utente prendendo in considerazione solo la tab pagamenti

    e poi metterle in left join su id_utente per calcolare l'eventuale differenza tra dovuto e pagato

    HTH

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2000
    Messaggi
    60
    Quote Originariamente inviata da sspintux Visualizza il messaggio
    Ciao,

    potresti definirti sue subquery :

    1) somma del dovuto per ogni id_utente prendendo in considerazione solo la tab prestazioni
    2) somma del pagato per ogni id_utente prendendo in considerazione solo la tab pagamenti

    e poi metterle in left join su id_utente per calcolare l'eventuale differenza tra dovuto e pagato

    HTH
    era quello che avevo pensato successivamente; potreste aiutarmi con la sintassi, perchè ho fatto delle prove e non riesco a venirne a capo

  6. #6
    fa' due query separate e poi rimettile assieme come spiegato qui http://lnx.dicesare.com/sql/sql-come...-di-risultati/

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2000
    Messaggi
    60
    Quote Originariamente inviata da optime Visualizza il messaggio
    fa' due query separate e poi rimettile assieme come spiegato qui http://lnx.dicesare.com/sql/sql-come...-di-risultati/
    codice:
    SELECT id_utente,  SUM(tot_pagamenti) AS tot_pagamenti, SUM(tot_prestazioni) as tot_prestazioni FROM 
    (
        SELECT id_utente, SUM(importo) AS tot_pagamenti, 0 AS tot_prestazioni FROM pagamenti
            UNION
        SELECT id_utente, 0 AS tot_pagamenti, SUM(importo) AS tot_prestazioni FROM prestazioni
    ) AS subQry
    così facendo ottengo si due valori, che posso usare per il saldo, ma non viene fatta nessuna distinzione per utente (infatti tutti i valori vengono sommati), e non saprei comunque come legarla alla tabella degli utenti (perchè come detto, mi serve il classico listato degli utenti ED il valore del saldo)

  8. #8
    ti sei dimenticato la group by id_utente...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2000
    Messaggi
    60
    Quote Originariamente inviata da optime Visualizza il messaggio
    ti sei dimenticato la group by id_utente...
    avevo fatto diverse prove, ma non mettendola mai in tutti i posti contemporaneamente;

    rifinito il tutto, abbiamo:
    codice:
    Select subQry.id_utente,
      Sum(subQry.saldo) As saldo,
      utenti.*
    From (
        Select pagamenti.id_utente, (Sum(pagamenti.importo))*-1 As saldo From pagamenti Group By pagamenti.id_utente
        UNION
        Select prestazioni.id_utente, Sum(prestazioni.importo) As saldo From prestazioni Group By prestazioni.id_utente
        ) 
        As subQry Right Join
      utenti On utenti.id = subQry.id_utente
    Group By subQry.id_utente

    grazie per il vostro aiuto per arrivare alla soluzione, spero possa servire a qualcun altro in futuro!

  10. #10

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 © 2025 vBulletin Solutions, Inc. All rights reserved.