comparazione con data precedente

max1974

Utente Attivo
7 Mar 2013
107
0
16
Salve a tutti mi aiutate per favore con Mysql
sto selezionando i rifornimenti fatti con un automezzo id_auto n° 1:
Codice:
SELECT id,REPLACE(DATE_FORMAT(dt,GET_FORMAT(DATE,'EUR')),'.','/') as gg, km, lt, prezzo FROM tb_auto_rifornimenti
                WHERE tb_auto_rifornimenti.id_auto='1'";
adesso vorrei sapere in riferimento al rifornimento precedente quanti km sono stati percorsi
es:
DataKMLitriEuro
03/01/2020952025.3948.89
11/01/2020996861.2377.85

quando inserisco il rifornimento del 11/01/2020 vorrei sapere che ha percorso 448 km dato dai km attuali meno i km del rifornimento precedente (9968-9520) e sapere il consumo medio dato dai km Percorsi diviso i litri di rifornimento.

volevo farlo con la query..... e stavo provando cosi, ma mi da errore, credo che il problema sia se non esiste il record precedente...
Codice:
SELECT qr.*, (qr.km-qrp.km) as KM_Percorsi FROM(
SELECT id,REPLACE(DATE_FORMAT(dt,GET_FORMAT(DATE,'EUR')),'.','/') as gg,km,lt,prezzo
FROM tb_auto_rifornimenti
WHERE tb_auto_rifornimenti.id_auto='1'
ORDER BY dt)qr
UNION
SELECT qrp.* FROM(
SELECT id,REPLACE(DATE_FORMAT(dt,GET_FORMAT(DATE,'EUR')),'.','/') as gg,km,lt,prezzo
FROM tb_auto_rifornimenti
WHERE tb_auto_rifornimenti.id_auto='1'
ORDER BY dt DESC LIMIT 1)qrp
 

marino51

Utente Attivo
28 Feb 2013
3.016
174
63
Lombardia
non so se ho capito, in ogni caso ti posto una query e il suo risultato,
é una bozza ma contiene tutto quello che serve e puoi adattarla come vuoi
SQL:
SELECT
  t1.ID
, t1.Data
, t1.KM
, t1.Litri
, t1.Euro
, max(t2.Data)  as Pdata
, max(t2.KM)    as Pkm
, sum(t2.Litri) as Plitri
, sum(t2.Euro)  as Peuro
, t1.KM - max(t2.KM) as KMpercorsi
FROM tb_auto_rifornimenti t1
LEFT JOIN tb_auto_rifornimenti t2 ON t1.ID = t2.ID
AND t2.Data < t1.Data
WHERE t1.ID = 1
GROUP BY
  t1.ID
, t1.Data
, t1.KM
, t1.Litri
, t1.Euro
ORDER BY
  t1.ID
, t1.Data

RISULTATO

1580165513652.png


ps, tolto le chiocciole che avevo lasciato davanti ai nomi della tabella
 
Ultima modifica:

max1974

Utente Attivo
7 Mar 2013
107
0
16
non so se ho capito, in ogni caso ti posto una query e il suo risultato,
é una bozza ma contiene tutto quello che serve e puoi adattarla come vuoi
SQL:
SELECT
  t1.ID
, t1.Data
, t1.KM
, t1.Litri
, t1.Euro
, max(t2.Data)  as Pdata
, max(t2.KM)    as Pkm
, sum(t2.Litri) as Plitri
, sum(t2.Euro)  as Peuro
, t1.KM - max(t2.KM) as KMpercorsi
FROM tb_auto_rifornimenti t1
LEFT JOIN tb_auto_rifornimenti t2 ON t1.ID = t2.ID
AND t2.Data < t1.Data
WHERE t1.ID = 1
GROUP BY
  t1.ID
, t1.Data
, t1.KM
, t1.Litri
, t1.Euro
ORDER BY
  t1.ID
, t1.Data

RISULTATO

Vedi l'allegato 6917

ps, tolto le chiocciole che avevo lasciato davanti ai nomi della tabella
Grazie 1000 Marino51 ho modificato la tua query con i miei campi etc , ma credo di aver fatto qualche errore o ci sia qualche problema
Ecco come l'ho modificata
Codice:
SELECT t1.id,
    REPLACE(DATE_FORMAT(t1.dt,GET_FORMAT(DATE,'EUR')),'.','/') as gg,
    t1.km,
    t1.lt,
    t1.prezzo,
    REPLACE(DATE_FORMAT(t2.dt,GET_FORMAT(DATE,'EUR')),'.','/') as Pgg,
    max(t2.km) as Pkm,
    sum(t2.lt) as Plitri,
    sum(t2.prezzo) as Pprezzo,
    (t1.km-max(t2.km)) as KMpercorsi
    FROM tb_auto_rifornimenti t1
    LEFT JOIN tb_auto_rifornimenti t2 ON t1.id = t2.id AND t2.dt < t1.dt
    WHERE t1.id_auto = 1
    GROUP BY t1.id, t1.dt, t1.km, t1.lt, t1.prezzo
    ORDER BY t1.id, t1.dt
ecco il risultato.....
1580200922278.png


ti mando intera tabella per controllare...
Codice:
CREATE TABLE `tb_auto_rifornimenti` (
  `id` int(11) NOT NULL,
  `dt` date NOT NULL,
  `km` int(11) DEFAULT NULL,
  `lt` decimal(10,2) DEFAULT '0.00',
  `prezzo` decimal(10,2) DEFAULT '0.00',
  `id_auto` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `tb_auto_rifornimenti` (`id`, `dt`, `km`, `lt`, `prezzo`, `id_auto`) VALUES
(0, '2020-01-22', 10330, '41.23', '57.85', 1),
(1, '2020-01-03', 9520, '25.39', '48.89', 1),
(2, '2020-01-11', 9968, '61.23', '77.85', 1);
credo anche quel ORDER BY t1.id non sia corretto, in quanto potrei inserire un record successivo o precedente indipendentemente.
GRAZIE COME SEMPRE TROPPO GENTILE!!!
 

max1974

Utente Attivo
7 Mar 2013
107
0
16
aspe forse il problema è nella join


Codice:
SELECT t1.id,
REPLACE(DATE_FORMAT(t1.dt,GET_FORMAT(DATE,'EUR')),'.','/') as gg,
t1.km,
t1.lt,
t1.prezzo,
REPLACE(DATE_FORMAT(t2.dt,GET_FORMAT(DATE,'EUR')),'.','/') as Pgg,
max(t2.km) as Pkm,
sum(t2.lt) as Plitri,
sum(t2.prezzo) as Pprezzo,
(t1.km-max(t2.km)) as KMpercorsi
FROM tb_auto_rifornimenti t1
LEFT JOIN tb_auto_rifornimenti t2 ON t1.id_auto = t2.id_auto AND t2.dt < t1.dt
WHERE t1.id_auto = 1
GROUP BY t1.id, t1.dt, t1.km, t1.lt, t1.prezzo
ORDER BY t1.dt
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.389
338
83
@max1974

Quando posti codice PHP devi usare i tag [PHP]........[/PHP]non il tag [CODE].......[/CODE]
 
  • Like
Reactions: max1974

marino51

Utente Attivo
28 Feb 2013
3.016
174
63
Lombardia
si il problema é nella join, l'ID é da intendersi IDauto non l'ID del record,
PHP:
LEFT JOIN tb_auto_rifornimenti t2 ON t1.id_auto = t2.id_auto AND t2.dt < t1.dt

credo anche quel ORDER BY t1.id non sia corretto
anche in questo caso andrebbe ordinato per IDauto e data nel caso tu selezionassi più auto contemporaneamente

in quanto potrei inserire un record successivo o precedente
ma tu stai trattando 1 record anche se composto (JOIN) con record diversi, devi sempre fare riferimento a lui, sia che leghi valori precedenti e/o successivi
 

max1974

Utente Attivo
7 Mar 2013
107
0
16
Si Marino la tua osservazione è giustissima ma dato il caso che ho una
PHP:
WHERE t1.id_auto = 1
Significa che seleziono un auto alla volta ed in questo caso i vari
PHP:
GROUP BY t1.id_auto
ORDER BY t1.id_auto
secondo me nn hanno scopo di esistere...
Forse sto prendendo un abbaglio!!!!
 

marino51

Utente Attivo
28 Feb 2013
3.016
174
63
Lombardia
secondo me nn hanno scopo di esistere...
GROUP BY t1.id_auto
tutte le volte che ci sono funzioni max. sum e simili, il group by é necessario per stabilire il livello a cui raggruppare quei valori,
altri motori di database, esempio ms sql server, oracle, vogliono il set completo dei valori non raggruppati
mysql é più lasco in questo senso, io preferisco sempre indicarli

ORDER BY t1.id_auto
non costa molto e la query é già pronta per altri impieghi (vedi ad esempio una lista mensile di controllo)

ORDER BY t1.id_auto, data
potrebbe essere necessario perché non é garantito che il db restituisca in ordine di data …..

ma poi vale il buon senso
 
Discussioni simili
Autore Titolo Forum Risposte Data
P [Javascript] Stranezza con comparazione OR Javascript 3
xone [MySQL] Comparazione data per sistema di prenotazioni MySQL 23
L Sito Comparazione quote Programmazione 0
C Comparazione date in italiano PHP 1
A Comparazione tra Php e jsp? PHP 3
IImanuII SQL Select from e comparazione. PHP 7
A [C] comparazione file di testo Programmazione 3
G Menù a tendina di ricerca con query PHP 1
T fatture con voci fattura in php PHP 0
A Tabella con bottoni per aggiornamento record PHP 6
M Come selezionare e deselezionare radiobutton con jquery jQuery 1
MarcoGrazia Calcolo fra due date con esclusione delle feste PHP 7
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
M Inviare un file su un server remoto con JavaScript Javascript 0
L problema con query select PHP 2
M Come validare textarea con jquery jQuery 0
M Problemi con la stampa dei valori in php PHP 1
A Regex per isolare link interni con rel noopener PHP 0
L Problemi con il login PHP 2
F Creare elementi html con javascript Javascript 2
R Problema query con ricerca id numerico PHP 2
R [C#] Quali dipendenze occorrono su progetto "Setup" con Access Database? .NET Framework 0
F Problema con risposta PHP 0
A Sottoquery con group by per mese MySQL 0
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A Quale NVR con ingressi bnc ? IP Cam e Videosorveglianza 1
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
T Film interattivo con linguaggi web Programmazione 7
A pulsante di update campo mysql con javascript Javascript 2
R Tutto su utf-8 ma ancora problemi con i caratteri speciali in mysql MySQL 1
Barierta Testo a comparsa con passaggio del mouse Javascript 13
M Estrarre valore con SELECT COUNT PHP 0
G VBA OpenForm con WhereCondition + LIKE su campi differenti MS Access 5
sara3 Offresi articolista con esperienza Offerte e Richieste di Lavoro e/o Collaborazione 2
L Problema RAM con Tomcat 8 Apache 0
S connesso, internet non disponibile ( con extebder tp-link850) Reti LAN e Wireless 0
L Menù con switch case C/C++ 1
Cosina Upload multiplo con invio allegati per email PHP 0
Cosina Upload multiplo con archiviazione in cartella PHP 16
B ciclare file xml con PHP PHP 1
napuleone problema con sort e asort PHP 4
F Group By con Alias condizionale MySQL 1
R [C#] Scrivere un post in grassetto con Selenium su FB Mobile .NET Framework 0
T cms con visualizzazione mind map Content Management System (CMS) 0
D Landing page con Wp Content Management System (CMS) 0
Z problemi con foreach insert into PHP 10
napuleone Con le date il codice da di matto o forse non è così Javascript 6
napuleone Con le date mi da di matto o forse è proprio così jQuery 1

Discussioni simili