如何在 SQL 中进行二维计数 table?
How to make a 2D count table in SQL?
我有一个包含多个字段的 table,我想输出一个 table,其中包含其中两个字段的所有组合的计数。例如:
Table Computers
ID | CPU Type | GPU Type
---------------------------
1 | CPU A | GPU A
2 | CPU A | GPU B
3 | CPU B | GPU C
4 | CPU B | GPU A
5 | CPU C | GPU B
6 | CPU D | GPU C
7 | CPU D | GPU B
8 | CPU D | GPU B
9 | CPU E | GPU E
10 | CPU A | GPU A
基本上我想做的是创建一个二维 table 计数,其中在这个 table 的每个条目中有多少计算机满足行和列标准的计数:
| GPU A | GPU B | GPU C | GPU D | GPU E |
-------------------------------------------------
CPU A | 2 | 1 | 0 | 0 | 0 |
CPU B | 1 | 0 | 1 | 0 | 0 |
CPU C | 0 | 1 | 0 | 0 | 0 |
CPU D | 0 | 2 | 1 | 0 | 0 |
CPU E | 0 | 0 | 0 | 0 | 1 |
这两个字段中的每一个都是对应 table 中的一个 FOREIGN KEY,并且有大量条目,因此没有机会对所有可能的值进行硬编码。
如何在 MySQL 中执行此查询。有什么想法吗?
谢谢。
使用Conditional Aggregate
计算每个GPU Type
。
select `CPU Type`,
count(case when `GPU Type` = 'GPU A' then 1 end) `GPU A`,
count(case when `GPU Type` = 'GPU B' then 1 end) `GPU B`,
count(case when `GPU Type` = 'GPU C' then 1 end) `GPU C`,
count(case when `GPU Type` = 'GPU D' then 1 end) `GPU D`,
count(case when `GPU Type` = 'GPU E' then 1 end) `GPU E`
from yourtable
group by `CPU Type`
因为这可以是任意数量的 GPU,但是 SQL 只能处理 return 一组已知列的查询,基本上有两个选项:
- 一次查询获取所有GPU。然后动态构建一个 SQL 查询(在 PHP、Java 或任何你正在使用的内容中)到每个 GPU return 一列。
- 获取行中的数据。使用您的应用程序(用 PHP、Java 或其他语言编写)从该数据构建网格。
我更喜欢第二个选项。所需的查询很简单:
select cpu_type, gpu_type, count(*)
from computers
group by cpu_type, gpu_type
order by cpu_type, gpu_type;
(AFAIK MySQL 不需要 order by 子句,因为它保证根据 GROUP BY 子句对记录进行排序。但是,这是非标准行为,可能会在一段时间内改变。更好当您希望对结果进行排序时,请习惯于正确使用 ORDER BY。)
我有一个包含多个字段的 table,我想输出一个 table,其中包含其中两个字段的所有组合的计数。例如:
Table Computers
ID | CPU Type | GPU Type
---------------------------
1 | CPU A | GPU A
2 | CPU A | GPU B
3 | CPU B | GPU C
4 | CPU B | GPU A
5 | CPU C | GPU B
6 | CPU D | GPU C
7 | CPU D | GPU B
8 | CPU D | GPU B
9 | CPU E | GPU E
10 | CPU A | GPU A
基本上我想做的是创建一个二维 table 计数,其中在这个 table 的每个条目中有多少计算机满足行和列标准的计数:
| GPU A | GPU B | GPU C | GPU D | GPU E |
-------------------------------------------------
CPU A | 2 | 1 | 0 | 0 | 0 |
CPU B | 1 | 0 | 1 | 0 | 0 |
CPU C | 0 | 1 | 0 | 0 | 0 |
CPU D | 0 | 2 | 1 | 0 | 0 |
CPU E | 0 | 0 | 0 | 0 | 1 |
这两个字段中的每一个都是对应 table 中的一个 FOREIGN KEY,并且有大量条目,因此没有机会对所有可能的值进行硬编码。
如何在 MySQL 中执行此查询。有什么想法吗?
谢谢。
使用Conditional Aggregate
计算每个GPU Type
。
select `CPU Type`,
count(case when `GPU Type` = 'GPU A' then 1 end) `GPU A`,
count(case when `GPU Type` = 'GPU B' then 1 end) `GPU B`,
count(case when `GPU Type` = 'GPU C' then 1 end) `GPU C`,
count(case when `GPU Type` = 'GPU D' then 1 end) `GPU D`,
count(case when `GPU Type` = 'GPU E' then 1 end) `GPU E`
from yourtable
group by `CPU Type`
因为这可以是任意数量的 GPU,但是 SQL 只能处理 return 一组已知列的查询,基本上有两个选项:
- 一次查询获取所有GPU。然后动态构建一个 SQL 查询(在 PHP、Java 或任何你正在使用的内容中)到每个 GPU return 一列。
- 获取行中的数据。使用您的应用程序(用 PHP、Java 或其他语言编写)从该数据构建网格。
我更喜欢第二个选项。所需的查询很简单:
select cpu_type, gpu_type, count(*)
from computers
group by cpu_type, gpu_type
order by cpu_type, gpu_type;
(AFAIK MySQL 不需要 order by 子句,因为它保证根据 GROUP BY 子句对记录进行排序。但是,这是非标准行为,可能会在一段时间内改变。更好当您希望对结果进行排序时,请习惯于正确使用 ORDER BY。)