Bug #18936 | Incorrect summarize with "WITH ROLLUP" option | ||
---|---|---|---|
Submitted: | 10 Apr 2006 9:07 | Modified: | 18 Sep 2007 15:55 |
Reporter: | Danilo Paliani | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server | Severity: | S3 (Non-critical) |
Version: | 5.1.10-BK, 5.1.7-beta | OS: | Linux (Linux, win32) |
Assigned to: | Tatiana Azundris Nuernberg | CPU Architecture: | Any |
[10 Apr 2006 9:07]
Danilo Paliani
[10 Apr 2006 9:24]
Danilo Paliani
Reproduncing bug commands
Attachment: sql51_bugtest.txt (text/plain), 6.28 KiB.
[10 Apr 2006 14:43]
Valeriy Kravchuk
Thank you for a problem report. I've got the following results for the first query of your test case: +-------------+----------------+---------+-------------+ | Percentuale | Tot_Imponibile | Tot_IVA | Tot_Importo | +-------------+----------------+---------+-------------+ | 4 | 1612.87 | 64.51 | 1677.38 | | 4 | 7483.36 | 299.33 | 7782.69 | | 4 | 4301.31 | 172.05 | 4473.36 | | 4 | -425.73 | -17.03 | -442.76 | | 4 | 12971.78 | 518.83 | 13490.61 | +-------------+----------------+---------+-------------+ 5 rows in set (0.07 sec) and for the second: +-------------+----------------+---------+-------------+ | Percentuale | Tot_Imponibile | Tot_IVA | Tot_Importo | +-------------+----------------+---------+-------------+ | 4 | 1612.87 | 64.51 | 1677.38 | | 4 | 7483.36 | 299.33 | 7782.69 | | 4 | 4301.31 | 172.05 | 4473.36 | | 4 | -425.73 | -17.03 | -442.76 | | 4 | 12971.81 | 518.86 | 13490.67 | +-------------+----------------+---------+-------------+ 5 rows in set (0.01 sec) on 5.1.10-BK (ChangeSet@1.2303.1.1, 2006-04-09 19:43:36-07:00) on Linux. So, they seems the same for me. Please, specify what did you expect to get and what is the indication of bug?
[10 Apr 2006 15:01]
Danilo Paliani
Hi and tx for reply. The totals in the last row of the first query is wrong. The totals in the last row of the second query is right.
[18 Sep 2007 15:55]
Tatiana Azundris Nuernberg
# streamlined test-case: DROP DATABASE IF EXISTS car; CREATE DATABASE car; USE car; CREATE TABLE vendite ( ID int(10) unsigned NOT NULL auto_increment, Prezzo float(6,3) default '0.000', PRIMARY KEY(ID)) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO vendite VALUES (NULL, 1.368), (NULL, 1.746), (NULL, 1.345), (NULL, -0.345); SELECT vendite.ID, SUM(vendite.Prezzo) AS orig, SUM(TRUNCATE(vendite.Prezzo,4)) AS trunc4, IF(vendite.Prezzo > 0, SUM(vendite.Prezzo + 0.0051), SUM(vendite.Prezzo - 0.0051)) AS with_if, SUM(vendite.Prezzo + SIGN(vendite.Prezzo) * 0.0051) AS with_sign, SUM(IF(vendite.Prezzo > 0, vendite.Prezzo + 0.0051, vendite.Prezzo - 0.0051)) AS fixed_if FROM vendite GROUP BY vendite.ID WITH ROLLUP ; # with_if = orig + 4 * 0.0051 (4 == n) # with_sign = orig + 2 * 0.0051 (2 == +1, +1, -1, +1) # fixed_if = orig + 2 * 0.0051, IF() belongs within SUM(), not without! # ID orig trunc4 with_if with_sign fixed_if # 1 1.368 1.3680 1.3731 1.3731 1.3731 # 2 1.746 1.7460 1.7511 1.7511 1.7511 # 3 1.345 1.3450 1.3501 1.3501 1.3501 # 4 -0.345 -0.3449 -0.3501 -0.3501 -0.3501 # NULL 4.114 4.1141 4.0936 4.1242 4.1242 DROP DATABASE car; # this in turn implies the following query for the original case: SELECT aliquoteiva.Percentuale, SUM(IF(vendite.Prezzo > 0, TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))+0.0051,2), TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))-0.0051,2)) ) AS Tot_Imponibile, SUM(IF(vendite.Prezzo > 0, TRUNCATE(((TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))+0.0051,2))*(aliquoteiva.Percentuale/100))+0.0051,2), TRUNCATE(((TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))-0.0051,2))*(aliquoteiva.Percentuale/100))-0.0051,2)) ) AS Tot_IVA, SUM(IF(vendite.Prezzo > 0, TRUNCATE(((TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))+0.0051,2))*(1+(aliquoteiva.Percentuale/100)))+0.0051,2), TRUNCATE(((TRUNCATE((vendite.Prezzo*(vendite.Peso_Lordo-(vendite.Numero_Colli*vendite.Tara_Unitaria)))-0.0051,2))*(1+(aliquoteiva.Percentuale/100)))-0.0051,2)) ) AS Tot_Importo FROM vendite LEFT JOIN aliquoteiva ON aliquoteiva.ID = vendite.ID_AliquoteIva LEFT JOIN fatturevendita ON fatturevendita.ID = vendite.ID_FattureVendita WHERE fatturevendita.Data_Emissione >= '20060410' AND fatturevendita.Data_Emissione <= '20060410' GROUP BY vendite.ID WITH ROLLUP ;