2016-12-13 56 views
0

今天卡住了這一點,並想知道有誰可以建議出了什麼問題。 這裏是我的代碼: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

託尼霍克空19.00

所以總計4 & 15.但我不想讓它顯示「Tony Hawk」兩次。我可以用Grand Total來替代這個嗎?也許這是一個加入問題,第二個託尼霍克也應該是空的。 感謝

回答

1

此行爲是在文檔的"GROUP BY Modifiers"部分解釋:

的MySQL允許那些沒有出現在列表GROUP BY一列在選擇列表命名。在這種情況下,服務器可以自由地從摘要行中的非聚合列中選擇任何值,並且這包括由WITH ROLLUP添加的額外行。例如,在下面的查詢中,國家是不會出現在GROUP BY列表,選擇此列值的非聚合列是不確定的:如果沒有啓用ONLY_FULL_GROUP_BY SQL模式發生

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 | 
+------+---------+-------------+ 

此行爲。如果啓用該模式,服務器會拒絕該查詢爲非法,因爲國家未在GROUP BY子句中列出。

現在,展現另一種價值「總計」,你可以使用一個包裹查詢與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; 
+0

嘿,但這仍顯示託尼霍克名兩次,是它的一個問題與我的加入? –

+0

連接正常。您可能需要將其放入子查詢中,並在外部查詢中執行附加的「if」。 – trincot