1

内容に応じて列を作成する必要がある状況があります。

たとえば、SQLFiddle はhttp://sqlfiddle.com/#!2/0ec7a/1です。

次のような結果を得る必要があります。

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

どうすればいいですか?

CASE WHENMySQLマニュアルのステートメントとステートメントを見てい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 ではtrueis1falseis0であるため、条件を合計すると、それが真だった回数がカウントされます!

(ほとんどの?) 他のデータベースの場合、合計内で退屈なケースを使用する必要があります: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 に答える