[RISOLTO] Query, raggruppamento multiplo e somme parziali

di il
6 risposte

[RISOLTO] Query, raggruppamento multiplo e somme parziali

Buongiorno a tutti,

premetto che ho già fatto delle ricerche nel forum e nel Web ma, essendo le conoscenze sull'argomento relativamente scarse, non sono sicuro di cosa sto cercando e quindi non ho trovato risposta. a dire il vero non sono neanche sicuro di poter fare ciò che sto cercando di fare.

il problema è il seguente: a scopo didattico ho creato un database di gestione proprietà immobiliari. le tabelle e i campi utili sono:

>t_proprietà:
[ID_PROPRIETà], [NOME PROPRIETà], [id_inquilino]
>t_pagamenti_affitto:
[id_inquilino], [SOMMA PAGATA], [DATA PAGAMENTO]
>t_inquilino:
[ID_INQUILINO], [id_proprietà]
>t_spese:
[id_proprietà], [DATA SPESA], [SOMMA PAGATA]

le chiavi primarie sono i campi con la voce 'ID' in maiuscolo, mentre le voci 'id' minuscolo sono i campi esterni su cui viene creata la relazione tra tabelle.


lo scopo finale che cerco di raggiungere è la creazione di un grafico a 4 variabili (2 variabili indiendenti). lo scopo intermedio, punto centrale di questo thread, è la creazione di una query che mostri la somma delle spese E la somma delle entrate SUDDIVISE PER proprietà E SUDDIVISE PER anno.

ho creato due union query (una per l'anno che unisce gli anni della [DATA SPESA] e [DATA PAGAMENTO]) e una per il [NOME PROPRIETà]. ho provato a creare delle subquery (che indivisualmnte funzionano alla perfezione con SELECT DISTINCT) ma non riesco a unire il tutto.

Spero di essere stato sufficientemente chiaro.

Grazie dell'aiuto

6 Risposte

  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    Devi mostrare le query che hai provato, in modo che si possa ragionare su qualcosa.
  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    denial ha scritto:


    ... a scopo didattico ho creato un database di gestione proprietà immobiliari....
    Si tratta forse di un "esercizio scolastico", vietato dal punto 8, lettera d) del regolamento?
  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    Nono è a scopo autodidattico....niente di illecito
    Appena arrivo a casa mostro le query/tentativo
  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    Ecco le query usate:

    1 - union query per avere un campo [ANNO] universale*:
    SELECT year([DATA PAGAMENTO AFFITTO]) AS [ANNO] FROM t_pagamenti_affitto UNION SELECT year([DATA SPESA]) FROM t_spese;
    
    2 - union query per avere campo [NOME PROPRIETà] universale*:
    SELECT [npropu] AS [N PROP]
    FROM (SELECT Year([DATA PAGAMENTO AFFITTO]) AS [ANNO P], Sum(t_pagamenti_affitto.[SOMMA PAGATA]) AS [TOT E], t_proprietà.[NOME PROPRIETà] AS [npropu] FROM (t_proprietà INNER JOIN t_inquilini ON t_proprietà.ID_PROPRIETà = t_inquilini.id_proprietà) LEFT JOIN t_pagamenti_affitto ON t_inquilini.ID_INQUILINO = t_pagamenti_affitto.id_inquilino GROUP BY Year([DATA PAGAMENTO AFFITTO]), t_proprietà.[NOME PROPRIETà])  AS sbq_entrate
    UNION SELECT [nprope]
    FROM 
    (SELECT Year([DATA SPESA]) AS [ANNO S], Sum(t_spese.[AMMONTARE SPESA]) AS [TOT U], t_proprietà.[NOME PROPRIETà] AS [nprope], t_proprietà.ID_PROPRIETà FROM t_proprietà INNER JOIN t_spese ON t_proprietà.ID_PROPRIETà = t_spese.id_proprietà GROUP BY Year([DATA SPESA]), t_proprietà.[NOME PROPRIETà], t_proprietà.ID_PROPRIETà)  AS sbq_uscite;
    
    3 - la query vera e propria con le due subquery:
    SELECT sbq_entrate.[TOT E], sbq_uscite.[TOT U], Q_PROPERTY.[N PROP], Q_anno.ANNO
    FROM Q_anno, Q_PROPERTY,
           (SELECT  Year([DATA PAGAMENTO AFFITTO]) AS [ANNO P], Sum(t_pagamenti_affitto.[SOMMA PAGATA]) AS [TOT E], t_proprietà.[NOME PROPRIETà] AS [npropu]
                 FROM (t_proprietà INNER JOIN t_inquilini ON t_proprietà.ID_PROPRIETà = t_inquilini.id_proprietà) LEFT JOIN t_pagamenti_affitto ON t_inquilini.ID_INQUILINO = t_pagamenti_affitto.id_inquilino 
                     GROUP BY   Year([DATA PAGAMENTO AFFITTO]), t_proprietà.[NOME PROPRIETà])  AS sbq_entrate,
          (SELECT  Year([DATA SPESA]) AS [ANNO S], Sum(t_spese.[AMMONTARE SPESA]) AS [TOT U], t_proprietà.[NOME PROPRIETà] AS [nprope], t_proprietà.ID_PROPRIETà 
                 FROM t_proprietà INNER JOIN t_spese ON t_proprietà.ID_PROPRIETà = t_spese.id_proprietà 
                      GROUP BY Year([DATA SPESA]), t_proprietà.[NOME PROPRIETà], t_proprietà.ID_PROPRIETà)  AS sbq_uscite
    WHERE (((sbq_entrate.npropu)=[N PROP]) AND ((sbq_uscite.nprope)=[N PROP]));
    

    ora, specifico che la query unione del punto 2 (la Q_PROPERTY) è stata ricavata dall'unione dei campi delle subquery della query al punto 3, e non sono sicuro che sia corretto (una sorta di ripetizione o loop);

    le due subquery funzionano a perfezione: ottengo il risultato diviso per anno e per proprietà, il problema è quando provo a metterle insieme che salta tutto.


    spero di essermi spiegato a sufficienza.



    *ovvero le date e le entrate/uscite presenti nelle due tabelle possono differire;
  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    Ecco le query usate:

    1 - union query per avere un campo [ANNO] universale*:
    SELECT year([DATA PAGAMENTO AFFITTO]) AS [ANNO] FROM t_pagamenti_affitto UNION SELECT year([DATA SPESA]) FROM t_spese;
    
    2 - union query per avere campo [NOME PROPRIETà] universale*:
    SELECT [npropu] AS [N PROP]
    FROM (SELECT Year([DATA PAGAMENTO AFFITTO]) AS [ANNO P], Sum(t_pagamenti_affitto.[SOMMA PAGATA]) AS [TOT E], t_proprietà.[NOME PROPRIETà] AS [npropu] FROM (t_proprietà INNER JOIN t_inquilini ON t_proprietà.ID_PROPRIETà = t_inquilini.id_proprietà) LEFT JOIN t_pagamenti_affitto ON t_inquilini.ID_INQUILINO = t_pagamenti_affitto.id_inquilino GROUP BY Year([DATA PAGAMENTO AFFITTO]), t_proprietà.[NOME PROPRIETà])  AS sbq_entrate
    UNION SELECT [nprope]
    FROM 
    (SELECT Year([DATA SPESA]) AS [ANNO S], Sum(t_spese.[AMMONTARE SPESA]) AS [TOT U], t_proprietà.[NOME PROPRIETà] AS [nprope], t_proprietà.ID_PROPRIETà FROM t_proprietà INNER JOIN t_spese ON t_proprietà.ID_PROPRIETà = t_spese.id_proprietà GROUP BY Year([DATA SPESA]), t_proprietà.[NOME PROPRIETà], t_proprietà.ID_PROPRIETà)  AS sbq_uscite;
    
    3 - la query vera e propria con le due subquery:
    SELECT sbq_entrate.[TOT E], sbq_uscite.[TOT U], Q_PROPERTY.[N PROP], Q_anno.ANNO
    FROM Q_anno, Q_PROPERTY,
           (SELECT  Year([DATA PAGAMENTO AFFITTO]) AS [ANNO P], Sum(t_pagamenti_affitto.[SOMMA PAGATA]) AS [TOT E], t_proprietà.[NOME PROPRIETà] AS [npropu]
                 FROM (t_proprietà INNER JOIN t_inquilini ON t_proprietà.ID_PROPRIETà = t_inquilini.id_proprietà) LEFT JOIN t_pagamenti_affitto ON t_inquilini.ID_INQUILINO = t_pagamenti_affitto.id_inquilino 
                     GROUP BY   Year([DATA PAGAMENTO AFFITTO]), t_proprietà.[NOME PROPRIETà])  AS sbq_entrate,
          (SELECT  Year([DATA SPESA]) AS [ANNO S], Sum(t_spese.[AMMONTARE SPESA]) AS [TOT U], t_proprietà.[NOME PROPRIETà] AS [nprope], t_proprietà.ID_PROPRIETà 
                 FROM t_proprietà INNER JOIN t_spese ON t_proprietà.ID_PROPRIETà = t_spese.id_proprietà 
                      GROUP BY Year([DATA SPESA]), t_proprietà.[NOME PROPRIETà], t_proprietà.ID_PROPRIETà)  AS sbq_uscite
    WHERE (((sbq_entrate.npropu)=[N PROP]) AND ((sbq_uscite.nprope)=[N PROP]));
    

    ora, specifico che la query unione del punto 2 (la Q_PROPERTY) è stata ricavata dall'unione dei campi delle subquery della query al punto 3, e non sono sicuro che sia corretto (una sorta di ripetizione o loop);

    le due subquery funzionano a perfezione: ottengo il risultato diviso per anno e per proprietà, il problema è quando provo a metterle insieme che salta tutto.


    spero di essermi spiegato a sufficienza.



    *ovvero le date e le entrate/uscite presenti nelle due tabelle possono differire;
  • Re: [RISOLTO] Query, raggruppamento multiplo e somme parziali

    Grazie all'auto ricevuto tramite messaggio privato ho risolto il problema.
    C'erano degli errori di fondo nelle query unione e nelle subquery adottate (e nel mio modo di procedere!):
    1 - quando si vuol assegnare in una query ad un certo campo o espressione un altro nome, ovvero un Alias, questo non può essere delimitato dalle parentesi graffe e di conseguenza non può contenere spazi vuoti come invece è possibile per i nomi dei campi.
    2 - Il numero delle colonne e quindi dei campi nelle varie SELECT deve essere lo stesso.
    3 - in una query di unione il comportamento è quello di aggiungere record senza duplicarli
    inoltre bisogna fare attenzione che la sequenza delle colonne sia composta dallo stesso nome o alias dei campi.
Devi accedere o registrarti per scrivere nel forum
6 risposte