1

我有一种情况,我需要根据其内容创建列。

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

我需要得到这样的结果:

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

我该怎么做?

我正在查看MySQL 手册中的CASE WHEN语句和IF语句,但更清晰的解释将非常有用。

4

2 回答 2

6

你甚至不需要CASE

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

看到这个在 SQLFiddle 工作

之所以有效,是因为在 mysql 中,trueis1falseis 0,因此对条件求和计算它为真的次数!

对于(大多数?)其他数据库,您必须在 sum 中使用无聊的情况:sum(case when gender = 'm' then 1 else 0 end)

这种类型的数据布局称为“枢轴”。一些数据库,如 Oracle,通过对其 SQL 风格的特定扩展来本地支持它,但在 mysql 中,您必须“自己动手”。

于 2012-11-22T01:52:56.043 回答
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;
于 2012-11-22T01:54:19.670 回答