2012-02-23 38 views
1

似乎有類似的問題,但不符合我的特定問題。我怎樣才能做到這一點?我也製作了一個預期產出的示例表。Mysql結合特定的行結果,同時尊重未選擇的行

City   | population | 


Thermopolis   8 
Douglas    5 
Nampa    6 
Eiko    4 
Reno    7 
Medford    3 
Fresno    9 

我想讓結合道格拉斯,英子,弗雷斯諾他們​​柱沿一組。並得到預期的輸出:

Thermopolis   8 
Custom_Group  18 
Nampa    6 
Reno    7 
Medford    3 

回答

1

這裏有一種方法(基本上你使用GROUP BY並定義所有組):

SELECT GROUP_CONCAT(City), SUM(population) 
FROM my_table 
GROUP BY IF(City IN ('Douglas','Eiko','Fresno'), 1, City) 

按城市分組,將您的自定義羣組組合成一個城市。 GROUP_CONCAT將'道格拉斯,Eiko,弗雷斯諾'列爲該組的城市(儘管如果您想更改組名,則可以執行類似的IF(City IN (..), 'Custom_Group', City))。

+0

集團如果似乎是最優雅的解決方案,謝謝。 – Tek 2012-02-23 23:56:51

+0

如果我忽略了GROUP_CONCAT,它會很好地工作。除了將1更改爲「Custom_Group」似乎沒有改變組的名稱。它只是留下小組中第一個城市的名字。 – Tek 2012-02-24 00:26:08

+0

如果您想更改名稱,您必須在'SELECT'部分中更改'IF(City IN(...),'Custom_Group',City AS City'' - 您放入'GROUP BY'部分的內容是不相關的(除非它不能在你的表中不屬於該組的那個城市的名稱,這就是爲什麼我選擇了1) – 2012-02-24 00:58:26

0

下面是硬編碼的城市名單...

SELECT 
    CASE WHEN City IN (
     'Douglas', 
     'Eiko', 
     'Fresno' 
    ) THEN 'Custom_Group' ELSE City END AS City, 
    SUM(Population) AS Population 
FROM 
    Cities 
GROUP BY 
    CASE WHEN City IN (
     'Douglas', 
     'Eiko', 
     'Fresno' 
    ) THEN 'Custom_Group' ELSE City END 

一個更可持續的解決方案是創建一個控制你的城市分組的新表的解決方案...

SELECT 
    IFNULL(g.Group, c.City) AS City, 
    SUM(c.Population) AS Population 
FROM 
    Cities c LEFT JOIN 
    City_Groups g ON g.CityID = c.ID 
GROUP BY 
    IFNULL(g.Group, c.City)