我可以只使用MySQL查询构建半高级报告吗?

我可以只使用MySQL查询构建半高级报告吗?,mysql,Mysql,我有一个MySQL表,其结构和数据如下所示: name | date | type | value -----+------------+-------+------ foo | 2013-01-01 | blue | 4 foo | 2013-01-02 | green | 1 foo | 2013-01-01 | blue | 9 foo | 2013-01-02 | green | 5 bar | 2013-01-01 | blu

我有一个MySQL表,其结构和数据如下所示:

name | date | type | value -----+------------+-------+------ foo | 2013-01-01 | blue | 4 foo | 2013-01-02 | green | 1 foo | 2013-01-01 | blue | 9 foo | 2013-01-02 | green | 5 bar | 2013-01-01 | blue | 10 bar | 2013-01-02 | green | 4 bar | 2013-01-01 | blue | 6 bar | 2013-01-02 | green | 2 meow | 2013-01-01 | blue | 5 meow | 2013-01-02 | green | 6 meow | 2013-01-01 | blue | 4 meow | 2013-01-02 | green | 4
name | color | amount
名称|日期|类型|值 -----+------------+-------+------ foo | 2013-01-01 | blue | 4 foo | 2013-01-02 |绿色| 1 富2013-01-01蓝色9 foo | 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 我正在尝试构造一个将生成以下输出的查询:

name | blue | green -----+------+------ foo | 13 | 6 bar | 16 | 6 meow | 9 | 10 名称|蓝|绿 -----+------+------ 富| 13 | 6 巴| 16 | 6 喵喵| 9 | 10 将保留
名称
列。输出的
蓝色
绿色
列是基于
类型
表列的值生成的。这两列的值是所有
date
s的
value
表列的累积值。我希望这是有道理的

说到MySQL,这有点超出我的能力范围,所以我不知道从哪里开始。这是否可能使用MySQL,如果可能,如何实现?例如,如何基于单个表列的值创建输出列


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

试试:

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中没有类似SQL Server的
PIVOT
函数。

试试:

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中没有类似SQL Server的
PIVOT
函数。

如果已知值的数量,可以使用
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;

如果已知值的数量,可以使用
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;

一个简单的
分组
应该可以帮你解决这个问题

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;

…或者使用更简洁的MySQL特定代码

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

.

一个简单的
求和
分组
应该可以帮你解决这个问题

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;

…或者使用更简洁的MySQL特定代码

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

.

输出格式使您很难做到这一点(不必要?)。将给出如下输出的查询:

name | date | type | value -----+------------+-------+------ foo | 2013-01-01 | blue | 4 foo | 2013-01-02 | green | 1 foo | 2013-01-01 | blue | 9 foo | 2013-01-02 | green | 5 bar | 2013-01-01 | blue | 10 bar | 2013-01-02 | green | 4 bar | 2013-01-01 | blue | 6 bar | 2013-01-02 | green | 2 meow | 2013-01-01 | blue | 5 meow | 2013-01-02 | green | 6 meow | 2013-01-01 | blue | 4 meow | 2013-01-02 | green | 4
name | color | amount
在你的代码中,你可以很容易地重写到

name | blue | green
那对你有用吗

SELECT name, color, sum(value) as amount
FROM tablename
GROUP BY name, color

输出格式使您很难做到这一点(不必要?)。将给出如下输出的查询:

name | date | type | value -----+------------+-------+------ foo | 2013-01-01 | blue | 4 foo | 2013-01-02 | green | 1 foo | 2013-01-01 | blue | 9 foo | 2013-01-02 | green | 5 bar | 2013-01-01 | blue | 10 bar | 2013-01-02 | green | 4 bar | 2013-01-01 | blue | 6 bar | 2013-01-02 | green | 2 meow | 2013-01-01 | blue | 5 meow | 2013-01-02 | green | 6 meow | 2013-01-01 | blue | 4 meow | 2013-01-02 | green | 4
name | color | amount
在你的代码中,你可以很容易地重写到

name | blue | green
那对你有用吗

SELECT name, color, sum(value) as amount
FROM tablename
GROUP BY name, color
试一试

试一试


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


看看,例如,

您想在MySQL中的一条SQL语句中做什么是不可能的。您可以做的是创建一个“元查询”,它生成一个sql语句,然后您可以准备并执行该语句


看一看,例如,

这就是问题的重点,伊姆霍。“构建半高级报告”这是问题的关键,伊姆霍。“构建半高级报告”这不需要是一个单独的语句。检查更新的问题。这不需要是一个单独的陈述。检查更新的问题。