2012-02-23 2 views
1

비슷한 질문이있는 것 같지만 내 문제는 적합하지 않습니다. 이것을 어떻게 할 수 있습니까? 예상 출력을 가진 샘플 테이블을 만들었습니다.Mysql은 선택되지 않은 행을 존중하면서 특정 행 결과를 결합합니다.

City   | population | 


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

나는 그들의 population 컬럼과 함께 더글러스, 에이코, 프레스노을 결합하는 그룹을 만들고 싶어. 그리고 예상 출력을 얻을 : 여기

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은 'Douglas, Eiko, Fresno'를 해당 그룹의 도시로 표시합니다 (그룹 이름을 변경하려면 비슷한 IF(City IN (..), 'Custom_Group', City)을 사용할 수도 있음).

+0

그룹이 가장 우아한 해결책 인 것으로 보이는 경우 감사합니다. – Tek

+0

GROUP_CONCAT을 생략하면 아름답게 작동합니다. 단, 'Custom_Group'을 1로 변경해도 그룹 이름이 변경되지는 않습니다. 그룹에 처음으로 도시 이름이 남습니다. – Tek

+0

당신이'SELECT (도시) IN (...) ','Custom_Group ','도시 AS 도시 '를 이름을 바꾸고 싶다면'GROUP BY '부분에 무엇을 넣었습니까? 부적절한 것 (그 그룹에 속해 있지 않은 당신의 테이블에있는 도시의 이름이 될 수 없다는 것을 제외하고, 내가 1을 선택한 이유입니다.) –

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) 
관련 문제