MySQL: Matching/filling 包含邮政编码和 ID 列表的矩阵

MySQL: Matching/filling a matrix with a list of ZIP Codes and IDs

我正在尝试填写 table tbl_matrix。第一行包含唯一 ID。第一列包含唯一的邮政编码(5 个整数)。

另一个 table tbl_list 包含三列:'zip_code'、'id'、'occurrence'(大约 300000 行)。

现在我想 update/fill tbl_matrix 使用 algorithm/loop 检查 tbl_list 是否包含邮政编码和 ID 的组合以及 returns发生到 tbl_matrix。在某些情况下,该列表包含两个或多个相同的 zip_code 和 ID 组合,但出现次数不同。在这种情况下,出现次数应该加起来。

我在 Windows 机器上使用 MySQL Workbench,我没有使用 Perl/Python/PHP 的经验,所以单独解决这个问题会很好在 MySQL.

在 Excel 中,我会在 tbl_matrix 中对每列使用一个 vlookup 函数,但直到现在我还无法从 Whosebug 中改编其他类似的 (My)SQL 示例。如果你能帮助我(这是一个大学项目),那就太好了。 非常感谢,拉尔斯。

如果我理解正确,你要做的是使用 MySQL 创建一个 动态枢轴 table(动态因为你不想要手动定义列,而是让它们从其他来源生成,在本例中是唯一的邮政编码)。参见 here

另请注意,在 Excel 中,第一行是唯一的邮政编码是有意义的,因为您无法更改列名(A、B、C 等)。然而,在 SQL 中,列名可以而且应该是唯一的邮政编码,因此不需要第一行邮政编码。

我认为这可能是解决问题的一种方法

create table thetable (id int, zip_code int,  occurrence int);
insert into thetable values (1,1,1), (2,1,2), (1,2,3), (1,2,4);

select id, 
       sum(if(zip_code=1, sum, 0)) zip1,
       sum(if(zip_code=2, sum, 0)) zip2
     from 
       (select id, zip_code, sum(occurrence) sum 
           from tbl_list  
         group by id, zip_code
       ) t
     group by id

结果

| id | zip1 | zip2 |
|----|------|------|
|  1 |    1 |    7 |
|  2 |    2 |    0 |

Demo on sqlfiddle