Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [mysql] SUM IF AND

  1. #1

    [mysql] SUM IF AND

    Buongiorno,

    ho questa query:

    codice:
    SELECT
    SUM( IF( variazione_sottoeventi_giornate.tipo='+', variazione_sottoeventi_giornate.numero, -variazione_sottoeventi_giornate.numero ) ) AS tot_giornate
    
    FROM variazione_sottoeventi_giornate
    
    WHERE variazione_sottoeventi_giornate.id_evento=331
    
    AND variazione_sottoeventi_giornate.tipologia='variazione_giornate'
    In questo modo funziona, cosa sbaglio invece in questa, dato che mi restituisce un valore diverso:

    codice:
    SELECT
    SUM( IF( variazione_sottoeventi_giornate.tipo='+' AND variazione_sottoeventi_giornate.tipologia='variazione_giornate', variazione_sottoeventi_giornate.numero, -variazione_sottoeventi_giornate.numero ) ) AS tot_giornate
    
    FROM variazione_sottoeventi_giornate
    
    WHERE variazione_sottoeventi_giornate.id_evento=331
    Grazie
    SK

  2. #2
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319
    I valori restituiti sono diversi perché hai modificato le opzioni di selezione in WHERE. Sono un po' arrugginito con SQL, ma se non sbaglio prima di tutto viene effettuata la selezione delle righe in base a WHERE, dunque viene eseguita la SELECT.

    Nel tuo caso considera variazione_sottoeventi_giornate.tipologia='variazi one_giornate'. Nella prima query poiché la scelta è all'interno di WHERE le righe che non rispettano questa clausola vengono subito eliminate, dunque non più considerate. Nella seconda query vengono selezionate invece anche le righe che NON rispettano la clausola poiché hai tolto la voce da WHERE, e quando viene eseguito dopo SELECT SUM(IF...) viene trovata la condizione falsa dunque è scelta l'opzione -variazione_sottoeventi_giornate.numero. Vedi bene che il risultato è diverso .

    Spero di essermi spiegato bene...
    "Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)

    >>> www.ombresulweb.com <<<

  3. #3
    Originariamente inviato da MatCap83
    I valori restituiti sono diversi perché hai modificato le opzioni di selezione in WHERE. Sono un po' arrugginito con SQL, ma se non sbaglio prima di tutto viene effettuata la selezione delle righe in base a WHERE, dunque viene eseguita la SELECT.

    Nel tuo caso considera variazione_sottoeventi_giornate.tipologia='variazi one_giornate'. Nella prima query poiché la scelta è all'interno di WHERE le righe che non rispettano questa clausola vengono subito eliminate, dunque non più considerate. Nella seconda query vengono selezionate invece anche le righe che NON rispettano la clausola poiché hai tolto la voce da WHERE, e quando viene eseguito dopo SELECT SUM(IF...) viene trovata la condizione falsa dunque è scelta l'opzione -variazione_sottoeventi_giornate.numero. Vedi bene che il risultato è diverso .

    Spero di essermi spiegato bene...
    Siamo d'accordo, ti sei spiegato benissimo, proprio perchè nella prima esiste un clausola WHERE, il conteggio avviene in maniera corretta e li la condizione IF all'interno di SUM è:

    codice:
    SUM( IF( variazione_sottoeventi_giornate.tipo='+', variazione_sottoeventi_giornate.numero, -variazione_sottoeventi_giornate.numero ) ) AS tot_giornate
    purtroppo è lunga, scorri a destra e guarda bene com'è strutturata

    mentre la seconda è:

    codice:
    SUM( IF( variazione_sottoeventi_giornate.tipo='+' AND variazione_sottoeventi_giornate.tipologia='variazione_giornate', variazione_sottoeventi_giornate.numero, -variazione_sottoeventi_giornate.numero ) ) AS tot_giornate
    Anche qui scorri e noterai le differenze.

    Ovvero, nella prima non esiste la condizione IF AND dentro a SUM, ma solo IF, quindi la clausola WHERE filtra il conteggio, nella seconda non esiste più un pezzo della clausola WHERE, ma esiste una condizione diversa dentro a SUM, ovvero, nella prima dico: se il campo "tipo" è uguale a "+" somma il valore del campo "numero", altrimenti sottrailo.
    Nella seconda la clausola WHERE "dovrebbe" non servire più, perchè all'interno di SUM la clausola diventa: se il campo "tipo" è uguale a "+" e il campo "tipologia" è uguale a "variazione_giornate", allora e solo allora somma il valore del campo "numero", altrimenti sottrai.

    Ovvio che sbaglio qualcosa, ma non riesco a capire cosa

  4. #4
    nel primo where ottieni solo i record che rispondono a id e tipologia. Quindi il SUM lavora solo su questi record.

    nel secondo where ottieni TUTTI i record che rispondono all'id a PRESCINDERE dalla tipologia e quindi il SUM sommera' i dati TRUE ma sottrarra' TUTTI i dati FALSE che saranno ben di piu' della precedente forma del where.

    In sostanza cambia il numero dei record su cui applichi il select e tutti i record che prima avevi scartato con il where e quindi ignorati dal SUM diventeranno ora invece tutti da sottrarre perche' risponderanno FALSE alla IF.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Ciao Piero,

    quello che non capisco è: ok, nella prima ho il where che prende solo i record di una determinata tipologia, ma nella seconda, l'if del sum non dovrebbe fare la stessa cosa?
    Nellla prima gli dico, somma se il campo tipo è uguale ad un detrminato valore, altrimenti sottrai, e nella clausola where specifico, solo se il campo tipologia ha un deteminao valore, ma nella seconda non riesco a capire perchè non funzioni, se in sum gli dico: somma solo se il campo tipo ha questo valore (come nella prima query) e il campo tipologia ha quest'altro valore, non più nella clausola where ok, ma nell'if del sum.
    Sarò de coccio ma non iesco a capire, tutto questo perchè vorrei fare una unica query per conteggiare il numero di diverse tipologie, invece di fare tot query per quante sono le tipologie, del tipo:

    codice:
    SUM( IF tipo='+' AND tipologia='pippo', numero, -numero ) AS tot_pippo,
    SUM( IF tipo='+' AND tipologia='paperino', numero, -numero ) AS tot_paperino,
    SUM( IF tipo='+' AND tipologia='minnie', numero, -numero ) AS tot_minnie,
    è vero, cambia il numero dei record processati, rimane il where che punta ad uno specifico evento, ma non alla specifica tipologia, quindi sicuramente sono di più, ma mi aspetterei che le clausole IF dentro a sum facessero la distinzione.

  6. #6
    Utente di HTML.it L'avatar di MatCap83
    Registrato dal
    Jun 2005
    residenza
    Firenze
    Messaggi
    1,319
    Originariamente inviato da piero.mac
    nel primo where ottieni solo i record che rispondono a id e tipologia. Quindi il SUM lavora solo su questi record.

    nel secondo where ottieni TUTTI i record che rispondono all'id a PRESCINDERE dalla tipologia e quindi il SUM sommera' i dati TRUE ma sottrarra' TUTTI i dati FALSE che saranno ben di piu' della precedente forma del where.

    In sostanza cambia il numero dei record su cui applichi il select e tutti i record che prima avevi scartato con il where e quindi ignorati dal SUM diventeranno ora invece tutti da sottrarre perche' risponderanno FALSE alla IF.
    Concordo con te! E' quello che avevo cercato di spiegare io, ma tu l'hai spiegato meglio .

    Quindi, per SK, la spiegazione mi sembra tutta qui! Anche se effettivamente a livello logico avere una clausola AND xxx in WHERE o in SUM (IF...) potrebbe sembrare simile. Semplicemente modificando la clausola in WHERE le righe su cui poi agirà SELECT sono diverse, e ovviamente cambieranno i risultati. Tutto qui!
    "Nessuno mi ha visto farlo, e non puoi provarlo in nessun modo!" (Bart Simpson)

    >>> www.ombresulweb.com <<<

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.