ROLLUP返回不正确的值

时间:2016-12-13 19:19:20

标签: mysql rollup

今天坚持这一点并且想知道任何人都可以建议出现问题。 这是我的代码:

select g.game_name, r.rental_id, sum(if(datediff(r.return_date, r.due_date) > 0, datediff(r.return_date, r.due_date) * g.overdue_charge_per_day, 0)) Overdue_Charges
from rental as r
left join game as g
on r.game_id = g.game_id
where month(r.return_date)=month(now())
group by rental_id
with rollup;

显示以下内容:

GTA V 12 4.00

托尼霍克13 15.00

Tony Hawk null 19.00

总共4& 15.但是我不想让它显示出来#Tony Hawk"两次。我可以用Grand Total替换它吗?也许这是一个加入问题,而第二个Tony Hawk也应该是空的。 感谢

1 个答案:

答案 0 :(得分:1)

此行为在文档的"GROUP BY Modifiers"部分进行了解释:

  

MySQL允许在选择列表中命名未出现在GROUP BY列表中的列。在这种情况下,服务器可以自由选择摘要行中此非聚合列的任何值,这包括WITH ROLLUP添加的额外行。例如,在以下查询中,country是非聚合列,未显示在GROUP BY列表中,并且为此列选择的值是不确定的:

mysql> SELECT year, country, SUM(profit)
    -> FROM sales GROUP BY year WITH ROLLUP;
+------+---------+-------------+
| year | country | SUM(profit) |
+------+---------+-------------+
| 2000 | India   |        4525 |
| 2001 | USA     |        3010 |
| NULL | USA     |        7535 |
+------+---------+-------------+
     

如果未启用ONLY_FULL_GROUP_BY SQL模式,则会发生此行为。如果启用该模式,则服务器拒绝该查询为非法,因为GROUP BY子句中未列出国家/地区。

现在,要显示另一个值“Grand Total”,您可以使用if这样的包装查询:

select    if(rental_id is null, 'Grand Total', game_name) game_name,
          rental_id,
          Overdue_Charges
from      ( 
        select    game_name 
                  r.rental_id, 
                  sum(if(datediff(r.return_date, r.due_date) > 0, 
                         datediff(r.return_date, r.due_date) * g.overdue_charge_per_day,
                         0)) Overdue_Charges
        from      rental as r
        left join game as g
               on r.game_id = g.game_id
        where     month(r.return_date)=month(now())
        group by  rental_id
        with rollup) sub;