1

我有三张桌子:

  • 套件(kit_id、kit_weight)
  • Kit_Components(kit_id、数量、component_id)
  • 组件(component_id,重量)

对于 kits 表中的每个条目,可以有一个或多个 Kit_Component 条目。每个组件都有一个权重列,如果我们还没有称重,它可以是权重或 null。我需要做的是运行 SQL 查询来更新 Kits 表的权重列,基于其所有组件的总重量乘以数量,或者如果任何权重为空,则将其值设置为空,但我什至不确定它可能,是吗?

注意:我想避免使用脚本、触发器或过程。我有在保存组件或更新套件时执行此操作的代码,但我希望能够批量执行此操作。


编辑:为了进一步澄清,我可以对权重 * 数量求和,但这不涉及为 NULL 的组件行,因为 NULL 在 SUM 中充当 0(我已经测试过)

例如 Kit1 有 1xComponentA 的权重为 14 和 2xComponentB 的权重为 NULL

SELECT kit_id, SUM(component.weight * kit_component.quantity) FROM kit_component INNER JOIN component ON kit_component.component_id = component.id GROUP BY kit_component.kit_id

这将为 kit1 返回 14,但是这是错误的,因为 ComponentB 没有权重,因此应该返回 NULL。

Hugo Kornelis:“如果组中的数据(由 GROUP BY 组成)有一些 NULL 和一些非 NULL 数据,则忽略 NULL,结果是剩余数字的总和:SUM {1, 3, NULL, 5} = SUM {1, 3, 5} = 9 如果组中的所有数据都是 NULL,则也忽略 NULL,根本没有要求和的行:结果是空集的总和;根据定义这是 NULL。SUM {NULL, NULL} = SUM {} = NULL。”

4

2 回答 2

0

根据您的编辑,您的问题似乎是NULL当任何值进入时返回以下查询NULL

SELECT kit_id, SUM(component.weight * kit_component.quantity)
FROM kit_component INNER JOIN
     component
     ON kit_component.component_id = component.id
GROUP BY kit_component.kit_id

您可以使用其他逻辑执行此操作:

SELECT kit_id,
       (case when count(component.weight) = count(*) and
                  count(component.quantity) = count(*)
             then SUM(component.weight * kit_component.quantity)
        end)
FROM kit_component INNER JOIN
     component
     ON kit_component.component_id = component.id
GROUP BY kit_component.kit_id

记住count(<field>)计算字段中非 NULL 值的数量。因此,计数本质上是说“所有值都是非空的”,或者等效地,“没有值是空的”。

于 2013-09-04T14:33:59.900 回答
0

环顾四周后,我意识到问题在于 SUM 处理具有一些 NULL 值的分组的方式。在找到这个 post SQL 查询以在包含的值为 NULL 时为 SUM(expression) 返回 NULL后,我制定了一个解决方案,如下所示:

UPDATE kits
        LEFT JOIN
    (SELECT 
        kit_id,
            IF(SUM(component.weight is NULL), NULL, SUM(component.weight * kit_component.quantity)) AS total_weight
    FROM
        kit_component
    INNER JOIN component ON kit_component.component_id = component.id
    GROUP BY kit_component.kit_id) AS weights ON kits.id = weights.kit_id 
SET 
    kits.weight = weights.total_weight

如果其任何组件权重为空,则这会将套件表权重更新为空,如果所有组件都具有有效值,则将总权重更新为空。

于 2013-09-04T14:40:56.917 回答