2016-03-04 62 views
0

我有一個名爲行程表,該表如下在MySQL行:使用組SQL此表入門需要使用GROUPBY

+-------+-----+----------+ 
| Name | Day | Distance | 
+-------+-----+----------+ 
| Ravi | 1 | 10  | 
| Ravi | 2 | 21  | 
| Ravi | 3 | 23  | 
| Hari | 1 | 12  | 
| Hari | 2 | 32  | 
| Kiran | 1 | 12  | 
| Kiran | 2 | 32  | 
| Kiran | 3 | 21  | 
| Kiran | 4 | 43  | 
+-------+-----+----------+ 

​​

我得到的結果如下

+-------+-----+----------+------------+ 
| Name | Day | Distance | total_dist | 
+-------+-----+----------+------------+ 
| Ravi | 1 | 10  | 54   | 
| Hari | 1 | 12  | 44   | 
| Kiran | 1 | 12  | 108  | 
+-------+-----+----------+------------+ 

這就是mysql默認提供的最上面一行沒有聚合的列。但我寧願讓該組中的所有彙總值或行與底行的行類似如下:

+-------+-----+----------+------------+ 
| Name | Day | Distance | total_dist | 
+-------+-----+----------+------------+ 
| Ravi | 3 | 23  | 54   | 
| Hari | 2 | 32  | 44   | 
| Kiran | 4 | 43  | 108  | 
+-------+-----+----------+------------+ 

或任何這樣:

+-------+-----+----------+------------+ 
| Name | Day | Distance | total_dist | 
+-------+-----+----------+------------+ 
| Ravi | 1 | 10  | 54   | 
| Ravi | 2 | 21  | 54   | 
| Ravi | 3 | 23  | 54   | 
| Hari | 1 | 12  | 44   | 
| Hari | 2 | 32  | 44   | 
| Kiran | 1 | 12  | 108  | 
| Kiran | 2 | 32  | 108  | 
| Kiran | 3 | 21  | 108  | 
| Kiran | 4 | 43  | 108  | 
+-------+-----+----------+------------+ 

我是新來使用的MySQL並與使用團體混淆,請指導我,如果任何上述兩個結果是可能得到的。

+0

工作,兩者都是可能的 - 這實際上,你需要什麼? – sgeddes

+0

我可以得到他們兩個,它會幫助我更好地瞭解組 –

+0

*「這是mysql默認情況下爲頂級行添加未彙總的列。」 - - 不是這樣。你的查詢不是'SQL',它不應該運行。 'MySQL'是仁慈的,忽略錯誤(不應出現在'GROUP BY'中的列應該被聚合)並生成一個記錄集。但它從列中選擇一些隨機值。結果是不確定的。如果您導出表數據並將其導入到其他數據庫中,則由相同查詢生成的結果集可能會有所不同。請閱讀此處:http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – axiac

回答

0

爲了獲得與sum每個組的整個列表,你可以使用子查詢和join總回原始表:

select t.name, t.day, t.distance, t2.total_dist 
from travel t 
    join (select name, sum(distance) total_dist 
     from travel 
     group by name) t2 on t.name = t2.name 

或者每組獲得max天,只需在子查詢中包含max(day)

select t.name, t.day, t.distance, t2.total_dist 
from travel t 
    join (select name, sum(distance) total_dist, max(day) max_day 
     from travel 
     group by name) t2 on t.name = t2.name and t.day = t2.max_day 
+0

這是完美的。但是我對第二個查詢有一點疑問。它工作完美,但有一個小問題。我仍然可以得到類似於第二個查詢的結果,如果有一些列表示isFinalDay,它表示y或n作爲它的值而不是第1,2,3天,如此處所用。 –

0

它會爲你

select name,max(day),max(distance) 
from tablename 
group by name 

等情況

select name,max(day),max(distance),(select sum(distance) from table) as total_dist 
from tablename 
group by name