Query di raggruppamento tra più tabelle con somme

di il
9 risposte

Query di raggruppamento tra più tabelle con somme

Ciao a tutti i membri del forum e... un grazie anticipato a chi contribuirà con il suo intervento!

Sto realizzando, a titolo personale una gestione investimi che si compone di diverse tabella, ma le principali sono I_Dossier, dove si registra il codice del contenitore di uno o più titoli insieme al riferimento alla banca, I_MovimentiAcq , dove per lo stesso IdDossier si possono avere più ordine delle stesso titolo o più titoli, terzo ed ultimo I_MovimentiVen in cui registro a fronte di un titolo la qt.a venduta anche parziale rispetto alla totalità totale del titolo. Vorrei quindi, se possibile, realizzare una query da utilizzare su un form per visualizzare per ogni singolo investimento (Idinvesti) il totale delle qta e valore degli acquisti e delle vendite. Il problema mi nasce nel momento che a fronte idtitolo della tabella I_MovimentiAcq posso avere più record nella tabella I_Movimentivend quindi i valori mi vengono moltiplicate per il numero record di quest’ultima tabella.

Queste le relazioni

 

Il contenuto di I_movimentoacq

Il contenuto di I_movimentovend

Questo il risultato della Query

Questa la query

SELECT I_MovimentiAcq.IDInvesti, Sum(I_MovimentiAcq.Qta) AS QtaAcq, Sum(I_MovimentiVen.Qta) AS QtaVen
FROM I_MovimentiAcq LEFT JOIN I_MovimentiVen ON I_MovimentiAcq.IDInvesti = I_MovimentiVen.IDInvesti
GROUP BY I_MovimentiAcq.IDInvesti;

Il risultato che vorrei ottenere è QtaAcq = 10. Non essendo molto esperto in sql non capisco se stò utilizzando la  query in modo corretto, o se devo cambiare strategia.

9 Risposte

  • Re: Query di raggruppamento tra più tabelle con somme

    Uhm... 

    Ha lo stesso schema di un gestionale magazzino.

    Fornitore è chi emette il titolo

    Magazzino sarebbe portafoglio titoli

    Clienti non serve basta la vendita come fosse da scontrino (registri la vendita e l'incasso)

    In effetti i titoli sono beni immateriali...

  • Re: Query di raggruppamento tra più tabelle con somme

    Come struttura di base è simile, ma se si sviluppa il concetto da una parte è necessario gestire i FIFO, e le interazioni con i conti correnti, dal lato magazzino , se non è molto sofisticato, non c'è bisogno ne di gestire il FIFO ne scorte minime ne date di scadenza materiali. In compenso visualizzazione giacenze e prelievi può essere paragonata a "bollati" di vendita e acquisto

  • Re: Query di raggruppamento tra più tabelle con somme

    Non ho scritto di usare un gestionale di magazzino ma di trarne spunto.

    20/03/2025 - Scolaretto ha scritto:

    ne date di scadenza materiali

    Beh, un titolo ha una scadenza a meno che non siano azioni, ma hanno una data di incasso.

    Titoli: {idtitolo, descrizione, bla bla}

    Subtitoli: {idsub, idtitolo, nrcedola}

    Sub trai spunto da lotti e matricole...

    poi ti mando la traccia della sql

  • Re: Query di raggruppamento tra più tabelle con somme

    Mi sembra che già ci sia un'errore sulla struttura, vedi campo IDInvesti che non è chiave primaria in nessuna delle due tabelle.

    Per aiutarti dovresti descrivere nei minimi dettagli, fase per fase, come si svolge l'Attività che vorresti riprodurre nel database.

  • Re: Query di raggruppamento tra più tabelle con somme

    La procedura si compone di tre tabella :

    A (Id_dossier) in cui si registra il nome dell'investimento es "Pluto" ed il conto bancario di riferimento e si assegna un codice univoco "IDinvesti" , lo stesso titolo può essere presente su più istituti bancari per cui il titolo "Pluto" può essere legato ad istituto bancaria o "A" e "B" con due idDossier e  Idinvesti diversi.

    B( Id_movimentiAcq) e la tabella in cui si registrato per lo stesso IdInvesti Movimenti diversi : 

    •  Importo investimento ,  prezzo , qta , Commissioni
    • Aumento o diminuzione qta,
    • dividendi e tasse.

     Ognuna di queste  operazione è una riga della tabella, ovviamente ci sono altre dati di "contorno" che non cito. Va detto però che per lo stesso titolo posso avere più acquisti nel tempo, e tutti hanno lo stesso IDInvesti che mi serve per ricondurlo al IdDossier.

    C (Id_MovimentiVen) in questa tabella si registrano la vendita dei titoli  con le relative perdite o guadagni. Le qtà che si vende  può essere uguale o minore rispetto al totale dell'acquistato. Il calcolo delle rendita viene fatto prendendo in esame il primo ordine di acquisto e da questo si recupera il prezzo di acquisto e tramite quello di vendita si calcola la rendita.

    Come nel caso precedente ogni operazione è una riga della tabella, ed a fronte di un unico IdInvesti si possono avere più ordini di vendita fino a raggiugere la parità tra acquistato e venduto.

    Quello che io non riesco fare è una query che raggruppi, senza moltiplicare la qtaAcq di tabella A per il numero dei record di tabella "B", e sommi i dati delle due tabella B-C, per IdInvesti.

    Es. 

  • Re: Query di raggruppamento tra più tabelle con somme

    Considerando le tabelle quelle mostrate nell'immagine la sintassi è questa:

    SELECT qrySommaTabellaA.IDInvesti, qrySommaTabellaA.SommaDiQtaAcq AS QtaAcq, IIf(IsNull([SommaDiQtaVen]),0,[SommaDiQtaVen]) AS QtaVen, [QtaAcq]-[QtaVen] AS Saldo
    FROM (SELECT [Tabella A].IDInvesti, Sum([Tabella A].QtaAcq) AS SommaDiQtaAcq
    FROM [Tabella A]
    GROUP BY [Tabella A].IDInvesti) AS qrySommaTabellaA LEFT JOIN (SELECT [Tabella B].IDInvesti, Sum([Tabella B].QtaVen) AS SommaDiQtaVen
    FROM [Tabella B]
    GROUP BY [Tabella B].IDInvesti) AS qrySommaTabellaB ON qrySommaTabellaA.IDInvesti = qrySommaTabellaB.IDInvesti;

    ma c'è da dire che la struttura del database molto probabilmente è sbagliata.

  • Re: Query di raggruppamento tra più tabelle con somme

    Ti ringrazio per l'aiuto, nel frattempo ho sviluppato una query di unione che risolve il mio problema.  La query è più completa ma  ci stò ancora lavorando sopra, le date  come sempre mi fanno dannare. Nello specifico quando una delle due tabelle non contiene vendite avere valorizzato la data con "" mi da problemi. Sto anche pensando di modificare le tabelle per rivedere le chiavi.

    Questa la query sviluppata
    SELECT UniQ.idinvesti, Sum(UniQ.QtaAcq) AS SommaDiQtaAcq, Sum(UniQ.qtaVen) AS TotQtVen, Min(UniQ.dataVen) AS MinDidataVen
    FROM (SELECT 
            I_MovimentiAcq.IDInvesti, I_MovimentiAcq.IdDossier, 
            I_MovimentiAcq.IDtitolo, I_MovimentiAcq.IdConto, 
            I_MovimentiAcq.Data as DataAcq, "" as dataVen,
            I_MovimentiAcq.QtaAcq, 0 as qtaVen,
            I_MovimentiAcq.Prezzo as PrezzoAcq, 0 as PrezzoVen, 
            I_MovimentiAcq.Commissione as CommAcq, 0 as CommVen,
            I_MovimentiAcq.Importo as ImpAcq , 0 as ImpVen,
            0 as RicVen
            FROM I_MovimentiAcq
         UNION ALL SELECT 
           I_MovimentiVen.IDInvesti, I_Movimentiven.IdDossier, 
           0 as idtitoloven, I_MovimentiVen.IdConto,  
           "" as dataAcq,  I_MovimentiVen.Data as DataVen, 
           0 as qtaacq, I_MovimentiVen.QtaVen,
           0  as PrezzoAcq, I_MovimentiVen.Prezzo as PrezzoVen,
           0 as CommAcq ,I_MovimentiVen.Commissione as CommVen,
           0 as Impacq, I_Movimentiven.Importo as ImpoVen,
           I_MovimentiVen.Ricavo
         FROM I_MovimentiVen)  AS UniQ
    GROUP BY UniQ.idinvesti;
    
  • Re: Query di raggruppamento tra più tabelle con somme

    La cosa sembra molto più primitiva...

    procedimento per capire cosa fare in questi casi...

    1) analizzare le due tabelle

    SELECT * FROM acquisti;
    SELECT * FROM vendite;
    
    risultato:
    +-------+-----------+-------+
    | acqId | titolo    | quant |
    +-------+-----------+-------+
    |     1 | pippo     |    10 |
    |     2 | pippo     |     4 |
    |     3 | pippo     |     5 |
    |     4 | pluto     |     2 |
    |     5 | pluto     |     2 |
    |     6 | paperino  |    20 |
    |     7 | basettoni |    34 |
    +-------+-----------+-------+
    +-------+----------+-------+
    | venId | titolo   | quant |
    +-------+----------+-------+
    |     1 | pippo    |     2 |
    |     2 | pippo    |     2 |
    |     3 | pippo    |     5 |
    |     4 | pluto    |     2 |
    |     6 | paperino |     2 |
    +-------+----------+-------+

    dobbiamo compattare le due tabelle..

    SELECT titolo,
           SUM(quant) as acquistati
         FROM   acquisti a
         group by titolo;
    SELECT titolo,
           SUM(quant) as venduti
         FROM   vendite b
         group by titolo;
         
    otteniamo:
    +-----------+------------+
    | titolo    | acquistati |
    +-----------+------------+
    | pippo     |         19 |
    | pluto     |          4 |
    | paperino  |         20 |
    | basettoni |         34 |
    +-----------+------------+
    +----------+---------+
    | titolo   | venduti |
    +----------+---------+
    | pippo    |       9 |
    | pluto    |       2 |
    | paperino |       2 |
    +----------+---------+

    a questo punto abbiamo la tabella a e la tabella b compattate...

    basta una semplice left join (possiamo avere acquisti senza vendite ma non vendite senza acquisti) tra tabella a e tabella b sostituendo le select ad a ed a b aggiungendo il saldo...

    SELECT a.titolo, acquistati, (IFNULL(venduti, 0)) as venduti , (acquistati-IFNULL(venduti, 0)) as potafoglio  //tabella C di risposta
    FROM (SELECT titolo,                  // tabella A
           SUM(quant) as acquistati
         FROM   acquisti
         group by titolo) a
    left join (SELECT titolo,             // tabella B
           IFNULL(SUM(quant), 0) as venduti
         FROM   vendite
         group by titolo) b on a.titolo=b.titolo;
         
    risultato:
    +-----------+------------+---------+------------+
    | titolo    | acquistati | venduti | potafoglio |
    +-----------+------------+---------+------------+
    | pippo     |         19 |       9 |         10 |
    | pluto     |          4 |       2 |          2 |
    | paperino  |         20 |       2 |         18 |
    | basettoni |         34 |       0 |         34 |
    +-----------+------------+---------+------------+

    dividi sempre il problema a passi più semplici.

  • Re: Query di raggruppamento tra più tabelle con somme

    Ti ringrazio stavo già provando la tua soluzione da lunedi ci lavoro.

Devi accedere o registrarti per scrivere nel forum
9 risposte