0

我想从中得到

+-----------+--------+---------+
| 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

但这需要更多代码来转换客户端的数据。

4

1 回答 1

0

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

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

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

于 2019-11-07T15:34:22.103 回答