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

    [MySQL] Calcolare differenza valore con record precedente

    Ciao Raga urge aiutino
    ipotizzando che abbia una tabella da utilizzare per il monitoraggio del controllo forniture in questo caso dell'acqua di un certo numero di filiali.
    Come faccio a tirare fuori un output che mi elenchi sia la rilevazione dei mc del mese (numero progressivo) sia il consumo mensile, in pratica da calcolare con la formula;
    consumo del mese precedente - consumo del mese ?

    Mi aiutate per favore ?

    Thanks

    codice:
    SELECT
    id,
    codice_filiale,
    rilevazione_consumo,
    anno,
    mese
    FROM consumo_acqua
    WHERE codice_filiale = 15
    AND anno = 2016
    ORDER BY mese ASC

  2. #2
    Solo per la precisione, mi correggo;
    no consumo ma valore, in pratica calcolare la differenza tra il valore del mese precedente con quello del mese attuale

  3. #3
    nessuno ?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Ciao newbobotime
    Se non dai indicazioni sulle tabelle e sulla loro struttura è difficile aiutarti!
    Comunque quello che ti serve dovrebbe essere qualcosa di simile a questo:
    codice:
    SELECT a.id,
    a.codice_filiale,
    a.rilevazione_consumo,
    a.anno,
    a.mese, 
    (a.rilevazione_consumo - b.rilevazione_consumo) as Consumo_Mensile 
    FROM consumo_acqua a 
    INNER JOIN consumo_acqua b
    WHERE a.mese = b.mese+1
    AND codice_filiale = 15
    AND anno = 2016
    ORDER BY mese ASC
    Ovviamente così strutturata (a patto che funzioni sulle tue tabelle) non ti darà il dato di gennaio.
    Comunque spero tu abbia capito il criterio e possa lavorare ad una soluzione.
    Ciao

  5. #5
    Uhm...
    a me non funziona con una semplice join
    ho dovuto prima creare una vista e metterla in join !

    Come detto prendiamo in esame i consumi di acqua con relativo inserimento della rilevazione dei consumi del contatore, quindi numero progressivo

    Tabella di esempio;
    codice:
    CREATE TABLE `html_acqua` (
      `id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
      `filiale` int(11) NOT NULL,
      `anno` int(4) NOT NULL,
      `mese` int(2) NOT NULL,
      `nro_contatore` varchar(30) NOT NULL,
      `rilevazione` decimal(8,3) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fil` (`filiale`) USING BTREE
    ) ENGINE=MyISAM AUTO_INCREMENT=1028 DEFAULT CHARSET=latin1;

    prima ho creato una view denominata v_acqua_2 per avere il mese maggiorato di 1, quindi semplice query;
    codice:
    SELECT
    anno,
    mese+1 AS mese_maggiorato,
    nro_contatore,
    rilevazione,
    filiale
    FROM html_acqua
    e poi utilizzando questa query per il risultato finale

    codice:
    SELECT
    a.pid_depot,
    a.nro_contatore,
    a.mese,
    a.rilevazione as ril_a,
    b.rilevazione AS ril_b,
    a.rilevazione-b.rilevazione AS consumo
    FROM rilevazioni_acqua AS a
    JOIN v_acqua_2 AS b ON b.pid_depot=a.pid_depot AND a.mese=b.mese_maggiorato AND a.anno = b.anno
    WHERE a.pid_depot = 15
    AND a.anno = 2015
    ORDER BY a.mese ASC

    Il problema rimane proprio il mese di gennaio, nessun suggerimento ?


    Grazie in anticipo per l'aiuto !!

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Devi inserire un if al posto del secondo membro della sottrazione.
    Se non riesci da solo domani cerco di postarti un codice.
    A proposito, che database usi perché il codice che ti ho postato é di mysql

  7. #7
    Il DB l'ho specificato come da regolamento nel titolo [MySQL]
    nota: solo per la precisione nei miei post di esempi ho lasciato pid_depot, in realtà si tratta dell'identificativo "filiale"
    in realtà in tabella l'ho nominato così pid_depot perchè si tratta di depositi.

    per quanto riguarda l'if, sinceramente non ho capito cosa intendi per "applicarlo al secondo membro della sottrazione".
    Non posso scrivere 0, dovrei teoricamente se sto analizzando il 2015, sottrarre il mese di gennaio con i dati del mese di dicembre 2014 (che ovviamente dovrebbero essere presenti)

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Ciao newbobotime,
    alla fine ho pensato che è preferibile un altro approccio (altrimenti hai problemi anche con dicembre)
    Questa l'ho provata sulla scorta della tabella che hai postato :

    Usando una subquery:
    codice:
    SELECT a.*, 
    (a.rilevazione - (SELECT rilevazione
                      FROM consumo_acqua b
                      WHERE STR_TO_DATE(CONCAT('01',LPAD(b.mese,2,'0'),b.anno),'%d%m%Y') = 
                      DATE_ADD(
                          STR_TO_DATE(CONCAT('01',LPAD(a.mese,2,'0'),a.anno),'%d%m%Y')
                          ,INTERVAL -1 MONTH)
                          )
    ) as Consumo_Mensile 
    FROM consumo_acqua a 
    WHERE a.anno = 2014
    ORDER BY mese ASC
    Senza subquery:
    codice:
    SELECT a.*, 
    (a.rilevazione - b.rilevazione) as Consumo_Mensile 
    FROM consumo_acqua a, consumo_acqua b 
    WHERE STR_TO_DATE(CONCAT('01',LPAD(b.mese,2,'0'),b.anno),'%d%m%Y') = 
                      DATE_ADD(
                          STR_TO_DATE(CONCAT('01',LPAD(a.mese,2,'0'),a.anno),'%d%m%Y')
                          ,INTERVAL -1 MONTH)
    AND a.anno = 2014
    ORDER BY mese ASC


    Fammi sapere se hai risolto
    Ultima modifica di genespos; 04-12-2015 a 13:13

  9. #9
    Mi dispiace
    ma a me non funziona.

    Ti riporto nuovamente i dump della tabella

    codice:
    CREATE TABLE `html_acqua` (
      `id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
      `filiale` int(11) NOT NULL,
      `anno` int(4) NOT NULL,
      `mese` int(2) NOT NULL,
      `nro_contatore` varchar(30) NOT NULL,
      `rilevazione` decimal(8,3) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fil` (`filiale`) USING BTREE
    )

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    117
    Guarda su sqlfiddle usando:
    codice:
    CREATE TABLE `consumo_acqua` (
      `id` int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
      `filiale` int(11) NOT NULL,
      `anno` int(4) NOT NULL,
      `mese` int(2) NOT NULL,
      `nro_contatore` varchar(30) NOT NULL,
      `rilevazione` decimal(8,3) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `fil` (`filiale`) USING BTREE
    );
    
    INSERT INTO `consumo_acqua`
    (`id`,`filiale`,`anno`,`mese`,`nro_contatore`,`rilevazione`)
    VALUES
    (NULL,'1111',2014,12,'1',100),
    (NULL,'1111',2015,1,'1',120),
    (NULL,'1111',2015,2,'1',130),
    (NULL,'1111',2015,3,'1',140),
    (NULL,'1111',2015,4,'1',150),
    (NULL,'1111',2015,5,'1',160),
    (NULL,'1111',2015,6,'1',170),
    (NULL,'1111',2015,7,'1',180),
    (NULL,'1111',2015,8,'1',190),
    (NULL,'1111',2015,9,'1',200),
    (NULL,'1111',2015,10,'1',210),
    (NULL,'1111',2015,11,'1',220),
    (NULL,'1111',2015,12,'1',230),
    (NULL,'1111',2016,1,'1',240)
    e una di queste query (o anche entrambe):

    codice:
    SELECT a.*, 
    (a.rilevazione - b.rilevazione) as Consumo_Mensile 
    FROM consumo_acqua a, consumo_acqua b 
    WHERE STR_TO_DATE(CONCAT('01',LPAD(b.mese,2,'0'),b.anno),'%d%m%Y') = 
                      DATE_ADD(
                          STR_TO_DATE(CONCAT('01',LPAD(a.mese,2,'0'),a.anno),'%d%m%Y')
                          ,INTERVAL -1 MONTH)
    AND a.anno = 2015
    ORDER BY mese ASC;
    
    SELECT a.*, 
    (a.rilevazione - (SELECT rilevazione
                      FROM consumo_acqua b
                      WHERE STR_TO_DATE(CONCAT('01',LPAD(b.mese,2,'0'),b.anno),'%d%m%Y') = 
                      DATE_ADD(
                          STR_TO_DATE(CONCAT('01',LPAD(a.mese,2,'0'),a.anno),'%d%m%Y')
                          ,INTERVAL -1 MONTH)
                          )
    ) as Consumo_Mensile 
    FROM consumo_acqua a 
    WHERE a.anno = 2015
    ORDER BY mese ASC
    vedrai che lì funziona!!

    Quindi guarda bene dove è il problema con il tuo DB. Ma su questo non credo di poterti aiutare.
    Ciao

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.