我想从中得到
+-----------+--------+---------+
| 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
,但这需要更多代码才能在客户端转换数据。
答案 0 :(得分:0)
您要查找的内容称为“枢轴”。如果您曾经在excel中使用过“数据透视表”,则它是一个非常相似的概念。基本上,您将自动发现行和列的名称,然后填写表格。
检出http://www.sqlservertutorial.net/sql-server-basics/sql-server-pivot/和“动态数据透视表”部分。
我不建议您在应用程序的SQL方面进行这种转换。我个人认为应该完全定义数据库中的所有查询和数据操作(而不是动态定义)。