1

私は3つのテーブルを持っています:

  • キット (kit_id、kit_weight)
  • Kit_Components (キット ID、数量、コンポーネント ID)
  • コンポーネント (component_id、重量)

キット テーブルの各エントリには、1 つ以上の Kit_Component エントリが存在する場合があります。各コンポーネントには、まだ重み付けしていない場合は重みまたは null のいずれかになる重み列があります。私がする必要があるのは、SQLクエリを実行して、すべてのコンポーネントの合計重量×数量に基づいてKitsテーブルの重量列を更新するか、重量のいずれかがnullの場合はその値をnullに設定することですが、よくわかりません可能ですよね?

注: スクリプト、トリガー、または手順は避けたいと思います。コンポーネントが保存されたとき、またはキットが更新されたときにこれを行うコードがありますが、これを一括で実行できるようにしたいと考えています。


編集:さらに明確にするために、重み*数量を合計できますが、NULLはSUMで0として機能するため、これはNULLであるコンポーネント行を処理しません(私はこれをテストしました)

たとえば、Kit1 には、重みが 14 の 1xComponentA と、重みが NULL の 2xComponentB があります。

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 以外の値の数をカウントすることを忘れないでください。したがって、カウントは本質的に「すべての値がnullでない」、または同等に「どの値もnullではない」と言っています。

于 2013-09-04T14:33:59.900 に答える