簡體   English   中英

MySQL-同一列使用不同的WHERE子句

[英]MySQL - Different WHERE clauses to same column

我有一種情況,我需要根據列的內容創建列。

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

我需要得到這樣的結果:

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

我該怎么辦?

我正在看《 MySQL手冊》中的CASE WHEN語句和IF語句,但是更清晰的解釋將非常有用。

您甚至都不需要CASE

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

請參見SQLFiddle中的工作

這樣做的原因是,在mysql中, true1false0 ,因此對一個條件求和就算它為true的次數!

對於(大多數?)其他數據庫,您必須在sum內使用無聊的大小寫: sum(case when gender = 'm' then 1 else 0 end)等等

這種類型的數據布局稱為“樞軸” 一些數據庫,例如Oracle,通過對其SQL風格的特定擴展來本地支持它,但是在mysql中,您必須“自己滾動”。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM