Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    6

    [MYSQL] Saldo PROGRESSIVO riga per riga

    Un saluto a tutti. Premesso che non sono un esperto di MYSQL, ho un DB con i seguenti campi "Data" "DescrizMovimento" ImportoEntrato" "ImportoUscito" popolato con diversi movimenti per giorno e NON in ordine di data. Il risultato che vorrei ottenere con una query (se possibile) sono i dati ordinati per data e con un campo calcolato (colonna) "SaldoProgressivo" riga per riga. Per meglio spiegarmi "ImportoEntrato" meno "ImportoUscito" tenendo conto delle righe precedenti. Esempio:
    "Data".."DescrizMovimento"."ImportoEntrato"."Impor toUscito"."SaldoProgressivo"
    15/01/12...aaaaaaaaaa........100,00..................... ........................100,00
    15/01/12...bbbbbbbbbb................................... .....50,00.................50,00
    20/01/12...cccccccccc.............20,00................. ................................70,00
    20/01/12...dddddddddd................................... .....25,00.................45,00
    ecc. ecc.
    Ho trovato qualcosa in rete ma funzionante in parte.
    Ringrazio anticipatamente chi mi vorrà dare una dritta.
    Saluti
    Pino P.
    Pino

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

    Un saluto a tutti. Premesso che non sono un esperto di MYSQL,

    Io invece sono meno esperto di te in MySql


    Il problema che ci poni lo ho risolto con 2 query
    relativamente semplici in Access


    Potrai riprenderti la struttura,
    adeguare la sintassi a MySql
    e poi potrai nidificarle in una unica query.


    __________________________________________________ ______


    Immaginiamo che hai la tabella "Tab" con i campi:

    __ Data ________________ DataOra
    __ DescrizMovimento ____ Testo
    __ ImportoEntrato ______ Valuta
    __ ImportoUscito _______ Valuta
    __ Id __________________ Key Autoincrementale

    __________________________________________________ _______


    Costruisci la prima query di nome "Q01"


    codice:
    SELECT 
    Year(Tab!Data) & "_" & Right("00" & Month(Tab!Data),2) & "_" & Right("00" & Day(Tab!Data),2) & "_" & Right("0000000000000000000000" & Tab!Id,20) AS Ord, 
    Tab.Data, 
    Tab.DescrizMovimento, 
    Tab.ImportoEntrato, 
    Tab.ImportoUscito, 
    Nz(Tab!ImportoEntrato,0)-Nz(Tab!ImportoUscito,0) AS Dgg
    FROM 
    Tab

    Dove il primo campo "Ord" sarà il tuo ordinamento
    e tiene conto
    dell'anno
    del mese ( aprile non deve diventare 4 bensi 04 )
    del giorno ( il 9 aprile non deve diventare 9 bensi 09 )
    di una stringa di 20 cifre con in coda il tuo Id
    Per bellezza i vari elementi sono separati da un underscore



    mentre l'ultimo campo "Dgg" è il delta per ogni record
    in pratica la sottrazione nel record fra entrate e uscite,
    pero se uno dei 2 valori è NULL viene trasformato in 0
    in Access si usa "Nz"
    in MySql potrebbe essere CASE, IF, COALESCE ??

    __________________________________________________ ____________

    Quando ti funziona la prima query ti costruisci la seconda
    di nome per esempio "Q05":

    codice:
    SELECT 
    Q01A.Ord, 
    Q01A.Data, 
    Q01A.DescrizMovimento, 
    Q01A.ImportoEntrato, 
    Q01A.ImportoUscito, 
    Sum(Q01B.Dgg) AS SaldoProgressivo
    FROM 
    Q01 AS Q01A 
    INNER JOIN 
    Q01 AS Q01B 
    ON 
    Q01A.Ord >= Q01B.Ord
    GROUP BY 
    Q01A.Ord, 
    Q01A.Data, 
    Q01A.DescrizMovimento, 
    Q01A.ImportoEntrato, 
    Q01A.ImportoUscito
    ORDER BY 
    Q01A.Ord
    Mi sa che in MySql ti cambiera
    un po la clausola GROUP BY

    __________________________________________________ _



    Finito

    Facci sapere

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    6
    Grazie nman per la risposta. Purtroppo Mysql non permette (che io sappia) che il comando SELECT faccia riferimento ad una query elaborata precedentemente (Q01). D'altronde la prima query "Q01" mi restituisce un risultato non ordinato per data in quanto il mio DB contiene i dati non ordinati cronologicamente. Bisognerebbe eseguire una prima query al fine i ordinare i dati cronologicamente; una seconda (che faccia riferimento alla prima) contenente un campo "numero_riga" progressivo e differente dall'ID; una terza (che faccia riferimento alla seconda) simile all'esempio da te proposto (Q05). In teoria penso di essere sulla strada giusta ma in pratica non riesco a costruire con MYSQL una query così strutturata. Se c'è qualcuno esperto in Mysql, mi farebbe piacere conoscere il suo parere.
    Nuovamente grazie nman e buona giornata.
    Pino P.
    Pino

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da pkss
    Purtroppo Mysql non permette (che io sappia) che il comando SELECT
    faccia riferimento ad una query elaborata precedentemente (Q01)
    Sicuro ? Mi sembra strano


    __________________________________________________ __________


    Originariamente inviato da pkss
    D'altronde la prima query "Q01" mi restituisce un risultato
    non ordinato per data in quanto il mio DB contiene
    i dati non ordinati cronologicamente.
    E' vero io avevo ordinato cronologicamente nell'ultima query


    _______________________________________________


    Originariamente inviato da pkss
    Bisognerebbe eseguire
    __una prima query al fine i ordinare i dati cronologicamente;
    __una seconda (che faccia riferimento alla prima)
    contenente un campo "numero_riga" progressivo e differente dall'ID;
    __una terza (che faccia riferimento alla seconda) simile all'esempio da te proposto (Q05)
    Questa che tu Ti stai proponendo è una validissima strada alternativa
    che utilizza la numerazione continua dei record



    __________________________________________________ _______
    __________________________________________________ _______


    Ma crolla il mondo intero per la tua prima affermazione
    che ( ti ripeto ) mi sembra molto strana,

    ____ se hai Q01
    SELECT
    campo1,
    campo2
    FROM
    Tabella


    ____ dopo non puoi fare Q02
    SELECT
    campo1,
    campo2
    FROM
    Q01

    ????


    Mi fai venire voglia questa sera di installarmi MySql
    su qualche macchina di prova



  5. #5
    nman, quella che tu chiami query (Q01) è in realtà una vista. parte del tuo ragionamento è basato su Access (ad esempio la funzione nz o l'uso del simbolo !) che ragiona in maniera diversa da qualunque altro db (tra l'altro Access NON è un db )


  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    6
    Ciao nman. A proposito della tua citazione:

    Ma crolla il mondo intero per la tua prima affermazione
    che ( ti ripeto ) mi sembra molto strana,

    ____ se hai Q01
    SELECT
    campo1,
    campo2
    FROM
    Tabella


    ____ dopo non puoi fare Q02
    SELECT
    campo1,
    campo2
    FROM
    Q01

    ????

    Tutti gli esempi di query che ho trovato sul libro di Ben Forta "Corso rapido di Mysql" (Mc Graw Hill) fanno riferimento sempre a tabelle e mai a query (viste come le chiama optime). Stesso discorso per gli esempi recuperati dalla rete. Su questo punto mi farebbe piacere avere conforto da un esperto. Per quanto riguarda ACCESS penso che sia molto flessibile anche se non è paragonabile a un DB Server.
    Pino P.
    Pino

  7. #7
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da optime
    nman, quella che tu chiami query è in realtà una vista
    E' vero, io prendo sempre questa Svista,
    è una questione di abitudine ad usare i nomi

    __________________________________________________ _


    Originariamente inviato da optime
    parte del tuo ragionamento è basato su Access (ad esempio la funzione nz o l'uso del simbolo !) che ragiona in maniera diversa da qualunque altro db (tra l'altro Access NON è un db )
    Anche questo è vero,
    Ma io talvolta mi creo rapidamente una "demo" in Access
    per "tradurla" poi in SQLServer ( o in questo caso MySql )





  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: [MYSQL] Saldo PROGRESSIVO riga per riga

    Originariamente inviato da pkss
    Un saluto a tutti. Premesso che non sono un esperto di MYSQL, ho un DB con i seguenti campi "Data" "DescrizMovimento" ImportoEntrato" "ImportoUscito" popolato con diversi movimenti per giorno e NON in ordine di data. Il risultato che vorrei ottenere con una query (se possibile) sono i dati ordinati per data e con un campo calcolato (colonna) "SaldoProgressivo" riga per riga. Per meglio spiegarmi "ImportoEntrato" meno "ImportoUscito" tenendo conto delle righe precedenti. Esempio:
    "Data".."DescrizMovimento"."ImportoEntrato"."Impor toUscito"."SaldoProgressivo"
    15/01/12...aaaaaaaaaa........100,00..................... ........................100,00
    15/01/12...bbbbbbbbbb................................... .....50,00.................50,00
    20/01/12...cccccccccc.............20,00................. ................................70,00
    20/01/12...dddddddddd................................... .....25,00.................45,00
    ecc. ecc.
    In genere queste 'rappresentazioni' si fanno utilizzando tool di reportistica che sono già preposti (Gruppo-sezioni o sub-report).

    Un'altro modo è creare una tabella ad hoc 'al volo' da codice (linguaggio di programmazione).

    Farlo via linguaggio SQL non credo sia agevole...


  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Sembra che ce la abbiamo fatta,

    Alla fine ho imparato anchio qualcosa su MySql
    ( era da tempo che volevo conoscerlo )


    _______________________________________________

    Ti passo direttamente i Dump ( si chiamano cosi in MySql ? )

    da me su MySql 5.5 (Free) + Workbranch funzionano bene

    __________________________________________________ ___

    Crei un nuovo DB di nome "db07"
    codice:
    CREATE SCHEMA `db07` ;

    __________________________________________________ ___



    la struttura della tabella di nome 'tab':
    codice:
    CREATE  TABLE `db07`.`tab` (
    
      `Id` INT NOT NULL ,
    
      `Data` DATE NULL ,
    
      `DescrizMovimento` VARCHAR(45) NULL ,
    
      `ImportoEntrato` INT NULL ,
    
      `ImportoUscito` INT NULL ,
    
      PRIMARY KEY (`Id`) );

    __________________________________________________ ______


    Un pò di dati casuali e senza nessun ordine:
    codice:
    INSERT INTO `db07`.`tab` 
    (`Id`, `Data`, `DescrizMovimento`, `ImportoEntrato`, `ImportoUscito`) 
    VALUES
    (1, '2012-01-15', 'aaa', 100, null),
    (2, '2012-01-15', 'bbb', null, 50),
    (3, '2012-01-20', 'ccc', 20, null),
    (4, '2012-01-20', 'ddd', null, 25),
    (25, '2012-12-03', 'eee', null, null),
    (12, '2012-08-13', 'fff', 5, 10),
    (6, '2012-12-13', 'ggg', 50, 40),
    (9, '2012-11-22', 'hhh', 25, null);


    __________________________________________________ ____

    La Vista 'q01'
    codice:
    USE `db07`;
    
    CREATE  OR REPLACE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `q01` AS 
    
    select 
    concat(cast(`tab`.`Data` as char(10) charset utf8),'_',right(concat('0000000000000000000000',`tab`.`Id`),20)) AS `Ord`,
    `tab`.`Data` AS `Data`,
    `tab`.`DescrizMovimento` AS `DescrizMovimento`,
    `tab`.`ImportoEntrato` AS `ImportoEntrato`,
    `tab`.`ImportoUscito` AS `ImportoUscito`,
    (coalesce(`tab`.`ImportoEntrato`,'0') - coalesce(`tab`.`ImportoUscito`,'0')) AS `Dgg` 
    from 
    `tab`
    ;


    __________________________________________________ ____

    La Vista 'q05'
    codice:
    USE `db07`;
    
    CREATE  OR REPLACE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `q05` AS 
    
    select 
    `q01a`.`Ord` AS `Ord`,
    `q01a`.`Data` AS `Data`,
    `q01a`.`DescrizMovimento` AS `DescrizMovimento`,
    `q01a`.`ImportoEntrato` AS `ImportoEntrato`,
    `q01a`.`ImportoUscito` AS `ImportoUscito`,
    sum(`q01b`.`Dgg`) AS `SaldoProgressivo`
     
    from 
    (
    `q01` `q01a` join `q01` `q01b` 
    on
    ((`q01a`.`Ord` >= `q01b`.`Ord`))
    ) 
    
    group by 
    `q01a`.`Ord`,
    `q01a`.`Data`,
    `q01a`.`DescrizMovimento`,
    `q01a`.`ImportoEntrato`,
    `q01a`.`ImportoUscito` 
    
    order by 
    `q01a`.`Ord`
    ;


    __________________________________________________ ____


    Finito



  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    6
    GRAZIE nman funziona perfettamente! Ho ritenuto solamente di sostituire una riga della vista "q01" con la seguente per abbreviare il campo "ord":

    Concat(cast(`tab`.`Data` as char(10) charset utf8),'_', LPAD(`tab`.`Id`,5,'0')) AS `Ord`,

    Nuovamente grazie e alla prossima.
    Pino

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.