• 締切済み

一つ前のレコードの値と減算して、別テーブルにUPdateする方法について

テーブル1のデータを計算してテーブル2を作成したいと考えております。 計算については"数値"を更新日付の一つ前の値と引き算してその結果をテーブル2に挿入したいと思ってます。 テーブル1 ID 数値 更新日付 001 23 2008/02/23 2:00:00 001 34 2008/02/23 3:00:00 001 50 2008/02/23 4:00:00 001 23 2008/02/23 5:00:00 002 25 2008/02/23 3:00:00 002 50 2008/02/23 4:00:00 002 70 2008/02/23 5:00:00 002 50 2008/02/23 6:00:00 結果 テーブル2 ID 数値 更新日付 001 11  2008/02/23 3:00:00 001 16  2008/02/23 4:00:00 001 -27 2008/02/23 5:00:00 002 25  2008/02/23 4:00:00 002 20  2008/02/23 5:00:00 002 -20 2008/02/23 6:00:00 一応考えたのですが SELECT * FROM テーブル1 AS a, テーブル1 AS b WHERE (((a.ID)=[b].[ID]) AND ((b.更新日付)=(select min(更新日付) from テーブル1 as b where a.更新日付 < b.更新日付))) ORDER BY a.ID, a.更新日付); として、aとbの数値を引き算しようと考えていますが、可能なのでしょうか? ぜんぜん別の方法でもいいので教えていただけないでしょうか? 以上 よろしくお願いいたします。

みんなの回答

回答No.1

前の質問を締め切らずに継続する質問をする行為は、「続きの質問」として、ここでは規約違反です。 RDBMS名とバージョンを明示するように求めましたが、なぜ提示がないのでしょう?せっかく具体的なSQLを提示しても、dekinaikunさんの環境では実行できない可能性があります。 >aとbの数値を引き算しようと考えていますが、可能なのでしょうか? 可能かどうかと言われれば、可能です。 しかし、RDBには、「前の行」や「後の行」という概念がないので、利用者側で通番を付けるといった工夫が必要になります。また、そういった操作は、SQLだけでやるより、ストアドプロシジャを使うとか、アプリケーション側でやる方が、シンプルだし性能も出せます。 以下のように、表定義やデータを格納するSQLを貼り付けておくと、アドバイスする側としてもすぐに検索SQLの作成に入れるので、多くの人から早くアドバイスをもらえると思いますよ。 1.表定義例 create table tbl1 (seqno int identity(1,1), id int, 数値 int, 更新日付 datetime); 2.格納データ例 insert into tbl1(id,数値,更新日付) values(1,23,'2008/02/23 2:00:00'); insert into tbl1(id,数値,更新日付) values(1,34,'2008/02/23 3:00:00'); insert into tbl1(id,数値,更新日付) values(1,50,'2008/02/23 4:00:00'); insert into tbl1(id,数値,更新日付) values(1,23,'2008/02/23 5:00:00'); insert into tbl1(id,数値,更新日付) values(2,25,'2008/02/23 3:00:00'); insert into tbl1(id,数値,更新日付) values(2,50,'2008/02/23 4:00:00'); insert into tbl1(id,数値,更新日付) values(2,70,'2008/02/23 5:00:00'); insert into tbl1(id,数値,更新日付) values(2,50,'2008/02/23 6:00:00'); 3.検索例 select x.id, x.数値-(select 数値 from tbl1 where seqno=x.seqno-1) as 数値, x.更新日付 from tbl1 as x where x.seqno>all (select min(seqno) from tbl1 where x.id=id) order by x.id,x.更新日付 ;

関連するQ&A

  • 別テーブルの値をsetしてupdateしたい

    テーブルAとテーブルBで、idが一致したデータのみ、 テーブルAのフィールドにテーブルBの値を入れたいです。 tera termを使用して、 UPDATE tableA as a, tableB as b SET a.value = b.value WHERE a.id = b.id 上記のupdate文を流すと一行目の[as a]からsyntaxエラーが出ます。 ERROR 1064: You have an error in your SQL syntax near 'as a, tableB as b SET ~' at line 1 書き方が悪いのでしょうか? どのように記述すればb.valueをa.valueにsetできますか?

    • ベストアンサー
    • MySQL
  • 別テーブルのデータ結合

    PostgresSQLを勉強中です。 そこで質問ですが、A、Bという各テーブルの値の合計を求めたいのですがいまいちわからないので教えてください。 例 Aテーブル: ID type 値段 date 0001 あ 100 0902 0002 あ 110 0903 0003 え 421 0910 Bテーブル: ID type 値段  date 0001 お 500 0901 0002 か 210 0801 0004 さ 333 0901 となっているときにA,Bテーブルの合計をtypeは関係なく出したいのです。 たとえばIDが0001であれば100+500で600というかんじです。 下記のように結合はできましたが値段部分の総合計をどうやってだせばいいのかわかりません。 select date,type,値段 from Aテーブル where ID = '0001' and date >= '0901' UNION select date,type,値段 from Bテーブル where ID = '0001' and date >= '0901' order by date 簡単なのかもしれませんがおしえてください。 よろしくお願いします。

  • 結果にテーブル上存在しない列&値をつけたい。

    SELECT ID, NAME FROM TEST たとえば上記の結果で ID NAME 1 'A' 2 'B' 3 'C' 4 'D' 5 'E' と返ってくるとします。 これにテーブルには存在しない列をつけて、かつ、 こちらで指定した値を入れたいのですが可能でしょうか。 ID NAME VALUE 1 'A' 'あ' 2 'B' 'い' 3 'C' 'う' 4 'D' 'え' 5 'E' 'お' こうしたいのです。 SELECT ID, NAME, 'あ' AS VALUE FROM TEST これだと全て「あ」になってしまいますし…。 可能であればご教授いただけないでしょうか。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • SQLで複数テーブルの変数を1つにまとめる方法

    MySQL 5.5を使用しています。 以下のテーブルA、B(同じ構造でIDは重複しない)において A ID | ポイント 1 | 10 3 | 20 5 | 5 6 | 5 B ID | ポイント 2 | 20 4 | 20 7 | 5 select ID,hoge from A,B; とすると、 A.ID | B.ID | A.hoge | B.hoge 1 |. | 10 |. . | 2 |. | 20 3 |. | 20 |. . | 4 |. | 20 5 |. | 5 |. 6 |. | 5 |. . | 7 |. | 5 という結果が得られますが、これを ID2| foo 1 | 10 2 | 20 3 | 20 4 | 20 5 | 5 6 | 5 7 | 5 という形に同一の変数にまとめるにはどうすればいいでしょうか。 select A.ID as ID2, B.ID as ID2 from A,B; のようにasを使用して1つの変数を作成しようとしましたが、別の変数として 認識されていまいました。

    • ベストアンサー
    • MySQL
  • SELECTさせた値にそれぞれ別の処理をする方法

    SELECT id (price * 10) FROM table WHERE id IN (1, 2, 3) を、実行すると +--+-----+ | id | price | +--+-----+ | 1 | 100 | | 2 | 100 | | 3 | 100 | +--+-----+ に、なります。 この結果に対してid1には*10、id2には*20、id3には*30というような処理はMySQLで可能でしょうか? 期待値としては +--+-----+ | id | price | +--+-----+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +--+-----+ です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • sqlでNOT INでテーブルの値を比較

    テーブル ID NUM TNNO A 001 TN01 A 002 PC01 A 003 TN01 B 001 TNPC01 B 002 TN01 C 001 TN01 C 002 TN01 上記のようなテーブルがあります。 SQLで「NOT IN句」でテーブルの値の比較をやっているのですが、 結果が得られません。 IDが同じグループで、TNNOが違う行を取得したいのですが、 0件が返ってきます。 以下の結果を期待していますが、 ID NUM TNNO A 001 TN01 A 002 PC01 A 003 TN01 :どちらでも B 002 TN01 B 001 TNPC01 0件となります。 実行したクエリは以下ですが、 select * from tbl A where (A.num,A.tnno) not in (select num,tnno from tbl B where A.id=B.id); どこがいけないのでしょうか。理由がわかりますでしょうか。 NOT IN句を使うことがいけないのでしょうか。 取得するにはどう書き換えればよいのでしょうか。 よろしくお願いします。

  • テーブルに新しいレコードを追加する方法について

    ACCESS2007を使っています。 フィールドに以下のような項目があるテーブルAがあります。 日付 | 名称 | 項目 | MIN(数値) | MAX(数値) | チェック(Yes/No) また、以下のような項目があるテーブルBがあります。 日付 | 名称 | 項目 | ナンバー(数値) このテーブルAに以下のようなデータが入っているとして 1/1 | あああ | いいい | 10  | 100 | No 1/1 | あああ | ううう | 1 | 20 | Yes テーブルBに以下のようにレコードを追加したいのです。 1/1 | あああ | いいい | 10   1/1 | あああ | いいい | 11    ・  ・  ・ 1/1 | あああ | いいい | 100 1/1 | あああ | ううう | 1 1/1 | あああ | ううう | 2   ・  ・  ・ 1/1 | あああ | ううう | 20 1/1 | あああ | ううう | blank  最終的には、テーブルBをソースとしてラベル印刷したいと思っています。 レコードセットとFor~Nextなどを使えばできそうな気がするのですが、???です。 どなたかご指南いただけませんでしょうか?

  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???