我可以只使用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 | 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我可以只使用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
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语句,然后您可以准备并执行该语句
看一看,例如,这就是问题的重点,伊姆霍。“构建半高级报告”这是问题的关键,伊姆霍。“构建半高级报告”这不需要是一个单独的语句。检查更新的问题。这不需要是一个单独的陈述。检查更新的问题。