0

構造とデータが次のような MySQL テーブルがあります。

名前 | 日付 | タイプ | 価値
--+------------+-------+------
ふー | 2013-01-01 | 青 | 青 | 4
ふー | 2013-01-02 | 緑 | 1
ふー | 2013-01-01 | 青 | 青 | 9
ふー | 2013-01-02 | 緑 | 5
バー | 2013-01-01 | 青 | 青 | 10
バー | 2013-01-02 | 緑 | 4
バー | 2013-01-01 | 青 | 青 | 6
バー | 2013-01-02 | 緑 | 2
ニャー | 2013-01-01 | 青 | 青 | 5
ニャー | 2013-01-02 | 緑 | 6
ニャー | 2013-01-01 | 青 | 青 | 4
ニャー | 2013-01-02 | 緑 | 4

この出力を生成するクエリを作成しようとしています:

名前 | 青 | 青 | 緑
---+------+------
ふー | 13 | 6
バー | 16 | 6
ニャー | 9 | 10

name列は維持されます。出力のblueおよび列は、表の列greenの値に基づいて生成されます。typeこれら 2 つの列の値は、valueすべての のテーブル列の累積値ですdate。それが理にかなっていることを願っています。

MySQLに関しては、これは私のリーグから少し外れているため、どこから始めればよいかわかりません。これは MySQL を使用して可能ですか? たとえば、1 つのテーブル列の値に基づいて出力列を作成するにはどうすればよいでしょうか。


編集:指定する必要があります。これが単一のクエリである必要はありません。MySQL 以外のテクノロジーを使用せずに実行できる限り、サブクエリ、複数のクエリ、ビューなどに関する制約はありません。

4

6 に答える 6

3

値の数がわかっている場合はCASE、 andを使用できます。SUM()

SELECT  Name,
        SUM(CASE WHEN type = 'blue' THEN value ELSE 0 END) blue,
        SUM(CASE WHEN type = 'green' THEN value ELSE 0 END) green
FROM    tableName
GROUP   BY Name

ただし、値の数が不明な場合は、動的クエリを作成して、静的クエリと同じ結果を得ることができます。

SELECT  GROUP_CONCAT(DISTINCT
        CONCAT('SUM(CASE WHEN type = ''',
               type,
               ''' THEN value ELSE 0 END) AS ',
               CONCAT('`', type, '`')
               )) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT Name, ', @sql, ' 
                   FROM    tableName
                    GROUP   BY Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-09-11T14:45:05.203 に答える
1

シンプルなSUMwithGROUP BYで解決できます。

SELECT name, 
  SUM(CASE WHEN type='blue' THEN value ELSE 0 END) blue,
  SUM(CASE WHEN type='green' THEN value ELSE 0 END) green
FROM Table1
GROUP BY name;

でテストする SQLfiddle

...または、やや簡潔な MySQL 固有のコードを使用します。

SELECT name, 
  SUM(IF(type='blue', value, 0)) blue,
  SUM(IF(type='green', value, 0)) green
FROM Table1
GROUP BY name;

別の SQLfiddle

于 2013-09-11T14:45:12.740 に答える
0

出力形式が原因で、これが (不必要に?) 難しくなっています。次のような出力を与えるクエリ:

name | color | amount

あなたのコードで簡単に書き直すことができます

name | blue | green

それはあなたのために働くでしょうか?

SELECT name, color, sum(value) as amount
FROM tablename
GROUP BY name, color
于 2013-09-11T14:45:32.337 に答える
0

試す

SELECT name, sum(CASE type WHEN 'blue' THEN value END) blue,
             sum(CASE type WHEN 'green' THEN value END) green FROM tbl
GROUP BY name
于 2013-09-11T14:46:08.133 に答える
0

試す:

SELECT name,
    SUM(CASE WHEN type = 'blue' THEN value ELSE 0 END) AS blue,
    SUM(CASE WHEN type = 'green' THEN value ELSE 0 END) AS green
FROM yourTable
GROUP BY name

PIVOTたとえば、SQL Server にあるような機能は MySQL にはありません。

于 2013-09-11T14:45:04.980 に答える