我有下表描述的关系:

alpha_codes


ID

描述


beta_codes


ID

描述


实体


ID
数量
alpha_code_id


beta_codes_entities


ID
实体编号
beta_code_id


我想问的是,是否可以选择数量为GROUPED BY alpha_code和beta_code的总和,得到以下二维数组:

+------------+---------------+---------------+---------------+---------------+
|            |   betacode1   |   betacode2   |      ...      |   betacodeN   |
+------------+---------------+---------------+---------------+---------------+
| alphacode1 | SUM(quantity) | SUM(quantity) |      ...      | SUM(quantity) |
+------------+---------------+---------------+---------------+---------------+
| alphacode2 | SUM(quantity) | SUM(quantity) |      ...      | SUM(quantity) |
+------------+---------------+---------------+---------------+---------------+
|     ...    |      ...      |      ...      |      ...      | SUM(quantity) |
+------------+---------------+---------------+---------------+---------------+
| alphacodeN | SUM(quantity) | SUM(quantity) | SUM(quantity) | SUM(quantity) |
+------------+---------------+---------------+---------------+---------------+


到目前为止,我有以下简单查询,尽管它返回了所有必需的数据,但结果集格式却有所不同,并且需要手动修改以构建上表所示的二维数组。

SELECT
    `alpha_codes`.`code` as alphacode,
    `beta_codes`.`code` as betacode,
    SUM(`entities`.`quantity`)
FROM
    `entities`
        INNER JOIN
    `alpha_codes` ON `alpha_codes`.`id` = `entities`.`alpha_code_id`
        INNER JOIN
    `beta_code_entity` ON `beta_code_entity`.`entity_id` = `entities`.`id`
        INNER JOIN
    `beta_codes` ON `beta_codes`.`id` = `beta_code_entity`.`beta_code_id`
GROUP BY `alpha_codes`.`id` , `beta_codes`.`id`


输出值

+------------+---------------+------------------------+
| alphacode  |    betacode   | SUM(entities.quantity) |
+------------+---------------+------------------------+
| alphacode1 | betacode1     | SUM(entities.quantity) |
+------------+---------------+------------------------+
| alphacode1 | betacode2     | SUM(entities.quantity) |
+------------+---------------+------------------------+
| alphacode2 | betacode1     | SUM(entities.quantity) |
+------------+---------------+------------------------+
|     ...    |      ...      |           ...          |
+------------+---------------+------------------------+
| alphacodeN | SUM(quantity) | SUM(quantity)          |
+------------+---------------+------------------------+


如果固定数量的Betacode很少,我正在考虑为每个代码使用多个CASE语句。但是现实世界中的场景包括大约850个alpha码,1000个beta码和超过50万个实体,因此我也真的担心性能问题...

最佳答案

在下面的解决方案中:
SQL语句必须动态生成。
和短语列表(带有.....的部分)必须通过遍历betacode值来生成。您可以将Case语句放入函数中,同时将两个参数发送到函数中。

由于您已经处于必须构建N列的情况,因此N以前是未知的,只有在运行时才能知道,因此也可以基于betacode的值动态构建SUM短语不会有太大的不同/困难。

    Select alphacode,
    Sum(Case `beta_codes`.`id` When betacode1_value_goes_here Then quantity Else 0 End Case) as betacode1,
    Sum(Case `beta_codes`.`id` When betacode2_value_goes_here Then quantity Else 0 End Case) as betacode2,
    Sum(Case `beta_codes`.`id` When betacode3_value_goes_here Then quantity Else 0 End Case) as betacode3,
 ..............
    From
    FROM
        `entities`
            INNER JOIN
        `alpha_codes` ON `alpha_codes`.`id` = `entities`.`alpha_code_id`
            INNER JOIN
        `beta_code_entity` ON `beta_code_entity`.`entity_id` = `entities`.`id`
            INNER JOIN
        `beta_codes` ON `beta_codes`.`id` = `beta_code_entity`.`beta_code_id`
    GROUP BY `alpha_codes`.`id`


另一个解决方案是:

一种。创建一个临时表来容纳输出列。如果单个表中的列过多,则可以创建多个表(例如表分区),以后可以将它们连接起来。

b。循环浏览记录。从实体表或Betacode开始。在循环内编写Update语句,该语句将从已发布的查询中提取值。如果循环浏览betacode列,则将一次更新所有实体的一列。

09-15 15:08