Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di cms9651
    Registrato dal
    Mar 2010
    Messaggi
    107

    [MySQL] Problema su somma valori

    Ciao.

    Non riesco a risolvere un problema in mysql:

    codice:
    SELECT 
           Flight, Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8*1000 As Calc
         , sums.hrs
         , (((5)/Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8)*1000) As z
    FROM (
      SELECT 
          LEFT(my_Flight_zone,2) as Flight
        , `MONTH`
        , SUM(my_number_of_flight_hours_w+my_number_of_flight_hours_e) as Hrs
      FROM dotableone 
      GROUP BY Flight, `MONTH`
    ) sums
    GROUP BY Flight;
    
    +--------+--------------------+--------+--------------+
    | Flight | Calc               |hrs     | z            |
    +--------+--------------------+--------+--------------+
    | TO     | 314344665961.28992 |232771  |2.951057200   |
    +--------+--------------------+--------+--------------+
    Il valore dell'alias `hrs` è sbagliato in quanto il valore 232771 è solo la somma delle ore del mese 1.

    Invece avrei bisogno di sommare nell'alias `hrs`:

    1) 232771 (somma delle ore del mese 1)
    2) 237014 (somma delle ore del mese 2)
    3) 259979 (somma delle ore del mese 3)

    ed ottenere questo output:

    codice:
    SELECT (( (5)/ (232771+237014+(259979*14/31))*953.8)*1000) z;
    
    +----------+
    | z        |
    +----------+
    | 8.12166  |
    +----------+
    Grazie in anticipo per l'aiuto.

    Questa è la tabella in questione:
    codice:
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `dotableone`
    -- ----------------------------
    DROP TABLE IF EXISTS `dotableone`;
    CREATE TABLE `dotableone` (
      `my_Flight_zone` varchar(255) DEFAULT NULL,
      `my_number_of_flight_hours_w` int(10) DEFAULT NULL,
      `my_number_of_flight_hours_e` int(10) DEFAULT NULL,
      `Month` int(2) DEFAULT NULL,
      `Year` int(4) DEFAULT NULL,
      `ID` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    -- Records of dotableone
    -- ----------------------------
    INSERT INTO `dotableone` VALUES ('TO1M', '9035', '5822', '1', '2011', '1');
    INSERT INTO `dotableone` VALUES ('TO1N', '8499', '5384', '1', '2011', '2');
    INSERT INTO `dotableone` VALUES ('TO1O', '8915', '6918', '1', '2011', '3');
    INSERT INTO `dotableone` VALUES ('TO1P', '5135', '4838', '1', '2011', '4');
    INSERT INTO `dotableone` VALUES ('TO1Q', '10284', '7045', '1', '2011', '5');
    INSERT INTO `dotableone` VALUES ('TO5M', '8906', '6358', '1', '2011', '6');
    INSERT INTO `dotableone` VALUES ('TO5N', '18330', '10123', '1', '2011', '7');
    INSERT INTO `dotableone` VALUES ('TO5P', '6851', '5136', '1', '2011', '8');
    INSERT INTO `dotableone` VALUES ('TO5Q', '3487', '3769', '1', '2011', '9');
    INSERT INTO `dotableone` VALUES ('TO5R', '8415', '5146', '1', '2011', '10');
    INSERT INTO `dotableone` VALUES ('TO6M', '9087', '5938', '1', '2011', '11');
    INSERT INTO `dotableone` VALUES ('TO6N', '3986', '3840', '1', '2011', '12');
    INSERT INTO `dotableone` VALUES ('TO6O', '6434', '5492', '1', '2011', '13');
    INSERT INTO `dotableone` VALUES ('TOSR', '0', '20732', '1', '2011', '14');
    INSERT INTO `dotableone` VALUES ('TOER', '267', '22208', '1', '2011', '15');
    INSERT INTO `dotableone` VALUES ('TOVM', '0', '5601', '1', '2011', '16');
    INSERT INTO `dotableone` VALUES ('TOSA', '0', '790', '1', '2011', '17');
    INSERT INTO `dotableone` VALUES ('TO1M', '8911', '6221', '2', '2011', '18');
    INSERT INTO `dotableone` VALUES ('TO1N', '8477', '5865', '2', '2011', '19');
    INSERT INTO `dotableone` VALUES ('TO1O', '8904', '7020', '2', '2011', '20');
    INSERT INTO `dotableone` VALUES ('TO1P', '5431', '4965', '2', '2011', '21');
    INSERT INTO `dotableone` VALUES ('TO1Q', '9749', '7475', '2', '2011', '22');
    INSERT INTO `dotableone` VALUES ('TO5M', '8563', '6754', '2', '2011', '23');
    INSERT INTO `dotableone` VALUES ('TO5N', '18669', '9750', '2', '2011', '24');
    INSERT INTO `dotableone` VALUES ('TO5P', '6613', '5152', '2', '2011', '25');
    INSERT INTO `dotableone` VALUES ('TO5Q', '3555', '4036', '2', '2011', '26');
    INSERT INTO `dotableone` VALUES ('TO5R', '8714', '5847', '2', '2011', '27');
    INSERT INTO `dotableone` VALUES ('TO6M', '9401', '6175', '2', '2011', '28');
    INSERT INTO `dotableone` VALUES ('TO6N', '3924', '3649', '2', '2011', '29');
    INSERT INTO `dotableone` VALUES ('TO6O', '6971', '5844', '2', '2011', '30');
    INSERT INTO `dotableone` VALUES ('TOSR', '0', '21370', '2', '2011', '31');
    INSERT INTO `dotableone` VALUES ('TOER', '329', '22396', '2', '2011', '32');
    INSERT INTO `dotableone` VALUES ('TOVM', '0', '5574', '2', '2011', '33');
    INSERT INTO `dotableone` VALUES ('TOSA', '0', '710', '2', '2011', '34');
    INSERT INTO `dotableone` VALUES ('TO5N', '20532', '10911', '3', '2011', '35');
    INSERT INTO `dotableone` VALUES ('TO1M', '9912', '6554', '3', '2011', '36');
    INSERT INTO `dotableone` VALUES ('TO1N', '9597', '6172', '3', '2011', '37');
    INSERT INTO `dotableone` VALUES ('TO1O', '9643', '7810', '3', '2011', '38');
    INSERT INTO `dotableone` VALUES ('TO1P', '6132', '4935', '3', '2011', '39');
    INSERT INTO `dotableone` VALUES ('TO1Q', '11008', '8200', '3', '2011', '40');
    INSERT INTO `dotableone` VALUES ('TO5M', '9791', '6895', '3', '2011', '41');
    INSERT INTO `dotableone` VALUES ('TO5P', '7669', '5452', '3', '2011', '42');
    INSERT INTO `dotableone` VALUES ('TO5Q', '4265', '4227', '3', '2011', '43');
    INSERT INTO `dotableone` VALUES ('TO5R', '9214', '6109', '3', '2011', '44');
    INSERT INTO `dotableone` VALUES ('TO6M', '10608', '6663', '3', '2011', '45');
    INSERT INTO `dotableone` VALUES ('TO6N', '4438', '4499', '3', '2011', '46');
    INSERT INTO `dotableone` VALUES ('TO6O', '7017', '6015', '3', '2011', '47');
    INSERT INTO `dotableone` VALUES ('TOER', '327', '24889', '3', '2011', '48');
    INSERT INTO `dotableone` VALUES ('TOSA', '0', '809', '3', '2011', '49');
    INSERT INTO `dotableone` VALUES ('TOSR', '0', '23223', '3', '2011', '50');
    INSERT INTO `dotableone` VALUES ('TOVM', '0', '6463', '3', '2011', '51');

  2. #2
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955

    Re: [MySQL] Problema su somma valori

    Originariamente inviato da cms9651
    Ciao.

    Non riesco a risolvere un problema in mysql:

    codice:
    SELECT 
           Flight, Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8*1000 As Calc
         , sums.hrs
         , (((5)/Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8)*1000) As z
    FROM (
      SELECT 
          LEFT(my_Flight_zone,2) as Flight
        , `MONTH`
        , SUM(my_number_of_flight_hours_w+my_number_of_flight_hours_e) as Hrs
      FROM dotableone 
      GROUP BY Flight, `MONTH`
    ) sums
    GROUP BY Flight;
    
    +--------+--------------------+--------+--------------+
    | Flight | Calc               |hrs     | z            |
    +--------+--------------------+--------+--------------+
    | TO     | 314344665961.28992 |232771  |2.951057200   |
    +--------+--------------------+--------+--------------+
    Il valore dell'alias `hrs` è sbagliato in quanto il valore 232771 è solo la somma delle ore del mese 1.

    Invece avrei bisogno di sommare nell'alias `hrs`:

    1) 232771 (somma delle ore del mese 1)
    2) 237014 (somma delle ore del mese 2)
    3) 259979 (somma delle ore del mese 3)

    ed ottenere questo output:

    codice:
    SELECT (( (5)/ (232771+237014+(259979*14/31))*953.8)*1000) z;
    
    +----------+
    | z        |
    +----------+
    | 8.12166  |
    +----------+
    Grazie in anticipo per l'aiuto.
    La colpa è di MySql che consente di usare campi senza funzioni aggregate e non presenti nella group by.

    Secondo me il campo sums.hrs che metti nell'elenco campi della select dovrebbe essere SUM(sums.hrs)

  3. #3
    Utente di HTML.it L'avatar di cms9651
    Registrato dal
    Mar 2010
    Messaggi
    107
    Ciao Joe e grazie per la risposta.

    Con il tuo suggerimento ho fatto un passo avanti, cioè riesco a sommare correttamente le ore dei tre mesi 1,2 e 3 ma il calcolo dell'alias `z` continua ad essere sbagliato.

    Mi ritrovo con:
    codice:
    mysql> SELECT 
           Flight, Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8*1000 As Calc
         , SUM(sums.hrs)
    
         , (((5)/Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8)*1000) As z
    FROM (
      SELECT 
          LEFT(my_Flight_zone,2) as Flight
        , `MONTH`
        , SUM(my_number_of_flight_hours_w+my_number_of_flight_hours_e) as Hrs
      FROM dotableone 
      GROUP BY Flight, `MONTH`
    ) sums
    GROUP BY Flight;
    +--------+--------------------+---------------+-------------+
    | Flight | Calc               | SUM(sums.hrs) | z           |
    +--------+--------------------+---------------+-------------+
    | TO     | 336797856387.09601 | 729764        | 3.161847000 |
    +--------+--------------------+---------------+-------------+
    1 row in set

    a fronte di:
    codice:
    mysql> SELECT (( (5)/ (232771+237014+(259979*15/31))*953.8)*1000) z;
    +--------+
    | z      |
    +--------+
    | 8,0073 |
    +--------+
    1 row in set
    mysql>
    Il problema è il calcolo parziale delle ore volo del mese di marzo, cioè (259979*14/31)...
    Spero in un altro suggerimento.
    Grazie ancora-

  4. #4
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da cms9651
    Ciao Joe e grazie per la risposta.

    Con il tuo suggerimento ho fatto un passo avanti, cioè riesco a sommare correttamente le ore dei tre mesi 1,2 e 3 ma il calcolo dell'alias `z` continua ad essere sbagliato.

    Mi ritrovo con:
    codice:
    mysql> SELECT 
           Flight, Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8*1000 As Calc
         , SUM(sums.hrs)
    
         , (((5)/Sum(Hrs)*DAYOFMONTH(CURDATE())/DAYOFMONTH(LAST_DAY(CURDATE()))*953.8)*1000) As z
    FROM (
      SELECT 
          LEFT(my_Flight_zone,2) as Flight
        , `MONTH`
        , SUM(my_number_of_flight_hours_w+my_number_of_flight_hours_e) as Hrs
      FROM dotableone 
      GROUP BY Flight, `MONTH`
    ) sums
    GROUP BY Flight;
    +--------+--------------------+---------------+-------------+
    | Flight | Calc               | SUM(sums.hrs) | z           |
    +--------+--------------------+---------------+-------------+
    | TO     | 336797856387.09601 | 729764        | 3.161847000 |
    +--------+--------------------+---------------+-------------+
    1 row in set

    a fronte di:
    codice:
    mysql> SELECT (( (5)/ (232771+237014+(259979*15/31))*953.8)*1000) z;
    +--------+
    | z      |
    +--------+
    | 8,0073 |
    +--------+
    1 row in set
    mysql>
    Il problema è il calcolo parziale delle ore volo del mese di marzo, cioè (259979*14/31)...
    Spero in un altro suggerimento.
    Grazie ancora-
    Per sommi capi, la z è calcolata male.

    Se metti SUM(hrs)/ etc etc
    lo sviluppo non è come quello che vuoi, infatti esce:
    SELECT (( (5)/ ((232771+237014+259979)*15/31)*953.8)*1000) z;

    Dovresti scrivere la query in modo diverso e sommare i mesi per intero, diversamente dall'ultimo sul quale devi fare la proporzione.

  5. #5
    Utente di HTML.it L'avatar di cms9651
    Registrato dal
    Mar 2010
    Messaggi
    107
    Originariamente inviato da Joe Taras
    Dovresti scrivere la query in modo diverso e sommare i mesi per intero, diversamente dall'ultimo sul quale devi fare la proporzione.
    Scusa qui mi sono perso, cosa dovrei fare? ... grazie

  6. #6
    Utente di HTML.it L'avatar di Joe Taras
    Registrato dal
    Nov 2003
    residenza
    Taranto
    Messaggi
    955
    Originariamente inviato da cms9651
    Scusa qui mi sono perso, cosa dovrei fare? ... grazie
    In pratica tu stai facendo una SUM con tutti i valori e poi la moltiplichi. Ma così, secondo le tue intenzioni non va bene, perché tu vorresti sommare i valori precedenti e solo quello dell'ultimo periodo rapportarlo al fattore.

    Questo sinifica che non pui risolverlo con una sola istruzione ma devi, secondo me, scrivere una sub query che prende i valori dei periodi precedenti ed un'altra che solo sul corrente applcia questa proporzione.

  7. #7
    Utente di HTML.it L'avatar di cms9651
    Registrato dal
    Mar 2010
    Messaggi
    107
    Risolto con una stored procedure!
    grazie

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.