计算列中的值

时间:2019-11-07 15:07:40

标签: mysql

我想从中得到

+-----------+--------+---------+
| name      | color  | species |
+-----------+--------+---------+
| Tom       | grey   | cat     |
| Jerry     | brown  | mouse   |
| Sylvester | black  | cat     |
| Tweety    | yellow | bird    |
| Garfield  | orange | cat     |
| Odie      | yellow | dog     |
| Bugs      | grey   | rabbit  |
| Daffy     | black  | duck    |
+-----------+--------+---------+

对此

+---------+------+-------+-------+--------+--------+
| species | grey | brown | black | yellow | orange |
+---------+------+-------+-------+--------+--------+
| cat     |    1 |     0 |     1 |      0 |      1 |
| mouse   |    0 |     1 |     0 |      0 |      0 |
| bird    |    0 |     0 |     0 |      1 |      0 |
| dog     |    0 |     0 |     0 |      1 |      0 |
| rabbit  |    1 |     0 |     0 |      0 |      0 |
| duck    |    0 |     0 |     1 |      0 |      0 |
+---------+------+-------+-------+--------+--------+

在MySQL中。

如果我事先知道颜色,我知道该怎么做。

SELECT 
species,
COUNT(DISTINCT if (color='grey', name, null)) AS 'grey',
COUNT(DISTINCT if (color='brown', name, null)) AS 'brown',
COUNT(DISTINCT if (color='black', name, null)) AS 'black',
[...]
FROM animals
GROUP BY species

是否有一种方法可以在不为每种可能出现的每种颜色添加新的COUNT块的情况下实现?如果颜色名称不能用作列名称,则会出现问题。

SQL中最简单的方法是

SELECT
species, color, COUNT(name)
FROM animals
GROUP BY species, color

,但这需要更多代码才能在客户端转换数据。

1 个答案:

答案 0 :(得分:0)

您要查找的内容称为“枢轴”。如果您曾经在excel中使用过“数据透视表”,则它是一个非常相似的概念。基本上,您将自动发现行和列的名称,然后填写表格。

检出http://www.sqlservertutorial.net/sql-server-basics/sql-server-pivot/和“动态数据透视表”部分。

我不建议您在应用程序的SQL方面进行这种转换。我个人认为应该完全定义数据库中的所有查询和数据操作(而不是动态定义)。