プロが教える店舗&オフィスのセキュリティ対策術

以下テーブルでキー①ごとにキー➁がブレイクするたびに金額を集計するUPDATE文を作りたいです。
キー➁が同一の場合は最新の年月を採用します。
金額はすべてキー①単位で集計し設定します。
(キー①が001のレコードの金額は一律、90,000(20,000+30,000+40,000)で出力したいです。)

なかなかうまく書けず困っています。。
どなたかご教授願います。

【実行前テーブル】
No キー① キー➁  年月 金額
1  001   111  201804 10,000
2  001   111  201805 20,000
3  001   112  201804 30,000
4  001   113  201806 40,000
5  002   222  201807 50,000
6  002   222  201808 60,000

【実行後テーブル】
No キー① キー➁  年月 金額
1  001   111  201804 90,000
2  001   111  201805 90,000
3  001   112  201804 90,000
4  001   113  201806 90,000
5  002   222  201807 60,000
6  002   222  201808 60,000

質問者からの補足コメント

  • 以下補足いたします。
    前提としてSQLSERVERです。
    (最初に誤ってPostgreに投稿してしまい、削除できていませんでした)

    金額の編集仕様は、
    (1)キー①・②のグループ、最新年月の金額を取得し、キー①ごとに合計します。(集計用の金額項目を追加し、ここに出力します)
    (2)キー①単位で集約する。

    言葉足らずで申し訳ありませんでした。

      補足日時:2018/12/18 18:40
  • 実行イメージは以下になります。

    (1)【実行後テーブル】
    No キー① キー➁  年月 金額 キー①単位の金額
    1  001   111  201804  10,000 90,000
    2  001   111  201805  20,000 90,000
    3  001   112  201804  30,000 90,000
    4  001   113  201806 40,000 90,000
    5  002   222  201807  50,000 60,000
    6  002   222  201808  60,000 60,000

    (2)【実行後テーブル】
    キー① キー①単位の金額
    001   90,000
    002   60,000

      補足日時:2018/12/18 18:41

A 回答 (2件)

すみません、その「ブレイクするたび」って言葉をどういう意味で使っているのかがわかりません。




例を見ると

キー①、キー② のグループ、最新年月の金額を取得し、
それをキー①毎に合計する。
合計結果で元テーブルをUPDATEする。

というように見えます。

もし、上記でよいのなら、以下の考えでできるはずです。

(1) キー①、キー② のグループで、各グループの最大年月 を取得する
キー① キー➁  年月
001   111  201805
001   112  201804
001   113  201806
002   222  201808

(2) 元テーブルと(1) とをINNER JOINして、該当する行だけ抽出する
No キー① キー➁  年月 金額
2  001   111  201805 20,000
3  001   112  201804 30,000
4  001   113  201806 40,000
6  002   222  201808 60,000

(3) (2) を キー①でグループにして、各グループの総和を取得する
キー① 合計金額
001 90,000
002 60,000

(4) (3)の内容で元テーブルをUPDATE
 「(使っているデータベースシステム名) UPDATE JOIN」で検索すれば見つかるはず




ただ、そもそも、やりたいことはそれでいいの?という疑問があります。
列名から推測すると、月毎の売上金額とか単価とかのデータに見えます。

そうだとすると、UPDATEしてしまうと
「001 111の2018年05月の売上は20,000円でした」
という情報が
「001 111の2018年05月の売上は90,000円でした」
と書き変わってしまい、二度と「20,000円でした」という情報が得られなくなってしまいます。

7  001   111  201811 30,000
って行が追加されたのなら、元の状態なら
001 100,000
になるはずが
001 210,000
※ 111が30,000 112が90,000 113が90,000
になってしまいます。

こんな変な計算、実社会で使っているとは思えません。
(3)の合計を求めるところでやめるか、結果を「合計テーブル」みたいな別のテーブルに保存するか、というのが通常の運用方法だと思います。
    • good
    • 0
この回答へのお礼

上記に補足させていただきました。

回答いただいた内容を参考にさせていただきます。
説明足らずの質問に回答いただきありがとうございました。

お礼日時:2018/12/18 18:50

PostgreとSQL Serverの両方に質問されていますが


まずはなんのSQLを使っているかはっきりさせましょう

仮に20,000+30,000+40,000→90,000でアップデートするとして
結果90,000+90,000+90,000となってこれも→270,000とアップデートする必要がでて
一生アップデートし続けますね。
何をトリガーにどういう根拠でどこを更新するのかきちんと仕様を検討してください
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
上記に補足させていただきました。

お礼日時:2018/12/18 18:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す