如何在 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 一组已知列的查询,基本上有两个选项:

  1. 一次查询获取所有GPU。然后动态构建一个 SQL 查询(在 PHP、Java 或任何你正在使用的内容中)到每个 GPU return 一列。
  2. 获取行中的数据。使用您的应用程序(用 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。)