2012-11-22 37 views
1

我有一種情況,需要根據其內容創建列。MySQL - 對同一列的不同WHERE子句

例如,這裏是SQLFiddle - http://sqlfiddle.com/#!2/0ec7a/1

我需要得到這樣的結果:

-------------------------- 
| CITY | MALES | FEMALES | 
-------------------------- 
| NY | 5  | 2  | 
-------------------------- 
| DC | 2  | 1  | 
-------------------------- 

我怎麼去呢?

我正在查看CASE WHEN聲明和IF來自MySQL手冊的聲明,但更清晰的解釋將非常有用。

回答

6

你甚至不需要CASE

SELECT 
    city, 
    sum(gender = 'm') as males, 
    sum(gender = 'f') as females 
FROM Population 
group by city 

看到這個working in SQLFiddle

這部作品的原因是在MySQL中,true1false0,使總結的條件數有多少次是真的!

對於(?大多數)其他數據庫,你必須使用無聊的情況下,和裏面:sum(case when gender = 'm' then 1 else 0 end)

這種類型的數據佈局被稱爲"pivot"。一些數據庫,比如Oracle,通過對SQL的特定擴展來支持它,但是在mysql中你必須「自己推出」。

+0

感謝顯示了相當的情況下, 。將不需要研究目前的工作案例我正在做... +1 –

+0

這將工作的SQL Server? Plz回覆 –

+0

@mhasan no。你必須使用'sum(case when gender ='m'then 1 else 0 end)' – Bohemian

1
SELECT CITY, 
     SUM(CASE WHEN GENDER = 'M' THEN 1 ELSE 0 END) MALE, 
     SUM(CASE WHEN GENDER = 'F' THEN 1 ELSE 0 END) FEMALE 
FROM Population 
GROUP BY City 

你也可以做事先準備好的聲明

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(CASE WHEN GENDER = ''', 
     GENDER, 
     ''' then 1 ELSE 0 end) AS ', 
     GENDER 
    ) 
) INTO @sql 
FROM Population; 

SET @sql = CONCAT('SELECT CITY, ', @sql, ' 
        FROM Population 
        GROUP BY City'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+1

不是一個leet,因爲我:)看看如何做*無*案例... – Bohemian

+0

@Kuya:謝謝你展示另一種方式來完成它.. –

+0

@Bohemian是的,你說得對,那就是爲什麼我upvoted你答案:D –

相關問題