アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
件名ついてご教授ください。
あるテーブル(以下Aテーブル)上で金額の集計をUPDATE文を実行したのですが、更新されずに困っています。SQL文が誤っているのかと思いましたが別テーブル(以下Bテーブル)で試したところ問題なく更新されました。
金額は両方とも整数型(int)で定義しているため差異はない認識です。
データ数はA…10万件超、B…10件前後となっています。
何が原因かわからず困っています。

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

  • 補足させていただきます。
    実際にながしたUPDATE文は以下です。

    【SQL文】
    UPDATE テーブル
     SET 累計金額1 = A.累計金額1, 累計金額2 = A.累計金額2
     FROM (SELECT キー, 年月,
    SUM(金額1) OVER(PARTITION BY キー ORDER BY 年月 ROWS UNBOUNDED PRECEDING) AS 累計金額1,
    SUM(金額2) OVER(PARTITION BY キー ORDER BY 年月 ROWS UNBOUNDED PRECEDING) AS 累計金額2
     FROM テーブル AS A
    WHERE テーブル.キー = A.キー AND テーブル.年月 = A.年月;

      補足日時:2018/08/30 16:56

A 回答 (3件)

http://www.remember-the-time.xyz/2013/08/sql-ser …
これじゃないですか?

SUM() over 〜 といったウインドウ関数は、元の行をまとめたりしません。
この例では、 キー,年月 が同じ行が複数あれば、その行数だけ同じ行が存在します。
それを結合させれば、 テーブルの1行に対して、Aの複数行で更新しようとしてエラーになります。

テーブル
001 201804 10,000 5,000 10,000 5,000
001 201804 20,000 6,000 10,000 5,000
だったら
A
001 201804 30,000 11,000
001 201804 30,000 11,000
になって、
テーブル1行目 + A1行目
テーブル1行目 + A2行目
テーブル2行目 + A1行目
テーブル2行目 + A2行目


この場合だったら、ウィンドウ関数ではなく、集約関数(GROUP BYでまとめる)のSUMを使えばいいのでは。



個人としては、テーブルの設計からやりなおしだと思います。
    • good
    • 0
この回答へのお礼

回答遅くなり申し訳ありません。
おそらくテーブルAは並び順が不規則の為、更新できなかったのだと思われます。(テーブルBはソート済み)
ご教授いただいたようにGROUP BYでまとめ、問題なく更新しました。
ありがとうございました。

お礼日時:2018/09/07 13:16

テーブルにどんなデータが入っているのか?


SELECT キー, 年月, COUNT(*) AS 件数
FROM テーブル
GROUP BY キー, 年月
HAVING COUNT(*) > 1;
でどんな結果になりますか?
Bテーブル と Aテーブル の結果を教えてください。
    • good
    • 0
この回答へのお礼

回答遅くなり申し訳ありません。
おそらくテーブルAは並び順が不規則の為、更新できなかったのだと思われます。(テーブルBはソート済み)
GROUP BYでまとめ、問題なく更新しました。
知恵を出していただきありがとうございました。

お礼日時:2018/09/07 13:15

>更新されずに


エラーメッセージは出ないのですか?

別解)
UPDATE テーブル
 SET 累計金額1 = (SELECT SUM(A.金額1) OVER(ORDER BY A.年月 ROWS UNBOUNDED PRECEDING)
 FROM テーブル AS A WHERE テーブル.キー = A.キー AND テーブル.年月 = A.年月)
  , 累計金額2 = (SELECT SUM(A.金額2) OVER(ORDER BY A.年月 ROWS UNBOUNDED PRECEDING)
 FROM テーブル AS A WHERE テーブル.キー = A.キー AND テーブル.年月 = A.年月);

でどうかな。
    • good
    • 0
この回答へのお礼

いつも回答いただきありがとうございます。
正常終了扱いなのかエラーメッセージは出ませんでした。(結果が出力され、累計金額は変化なしという状態)

また、別解実行させていただきましたが、以下エラーが出てしまいました。

'サブクエリは複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後に続く場合や、サブクエリが 1 つの式として使われる場合は複数の値は許可されません。'

お礼日時:2018/08/30 19:18

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

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