今天坚持这一点并且想知道任何人都可以建议出现问题。 这是我的代码:
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.00Tony Hawk null 19.00
总共4& 15.但是我不想让它显示出来#Tony Hawk"两次。我可以用Grand Total替换它吗?也许这是一个加入问题,而第二个Tony Hawk也应该是空的。 感谢
答案 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;