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列保持不变。输出的bluegreen列是根据type表列的值生成的。这两列的值是value所有dates 的表列的累加值。我希望这是有道理的。

当谈到 MySQL 时,这有点超出我的范围,所以我不知道从哪里开始。这是否可以使用 MySQL,如果可以,如何?例如,如何根据单个表列的值创建输出列?


编辑:我应该指定;不需要这是一个单一的查询。只要它可以在不涉及 MySQL 以外的任何其他技术的情况下完成,那么我对子查询、多个查询、视图等没有任何限制。

4

6 回答 6

3

如果您知道值的数量,您可以使用CASE和。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

一个简单SUM的 withGROUP 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

尝试:

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

MySQL 中没有PIVOT像 SQL Server 中那样的功能。

于 2013-09-11T14:45:04.980 回答
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

您想要做的事情在 MySQL 中的单个 SQL 语句中是不可能的。您可以做的是创建一个“元查询”,它会生成一个 sql 语句,然后您可以准备和执行该语句。

看看,例如,mysql 选择动态行值作为列名,另一列作为值

于 2013-09-11T14:56:22.460 回答