SQLserver2005で年月ごとの体重を表示するSQL文の作成方法

このQ&Aのポイント
  • SQLserver2005環境で、テーブルAから指定した年月ごとの体重を表示するSQL文の作成方法について教えてください。
  • テーブルAには年月とIDでユニークなデータがあり、年月ごとに体重が保存されています。
  • 指定した年月で抽出をかけた際に、今月の体重と前月の体重を取得するSQL文を作成したいです。
回答を見る
  • ベストアンサー

SQL文を教えてください

SQLserver2005環境です。 テーブルA (年月とIDでユニーク) 年月      ID   体重 --------------------------- 2011年01月  1   50 2011年02月  1   51 2011年02月  2   40 2010年12月  3   59 2011年01月  3   60 2011年02月  3   61 2011年01月  4   70 のようになっていた場合、年月を2011年02月で抽出をかけた際に 今月体重を2011年02月、前月体重を2010年01月とし 年月      ID  今月体重  前月体重 --------------------------------------------- 2011年02月  1    51      50 2011年02月  2    40      Null 2011年02月  3    61      60 ↑の様な結果を得られるSQLを書きたいのですが、うまく作れず困っています。 ご教授いただけないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

サブクエリで取得するのが簡単なのではないでしょうか。 こんなイメージです。 select  年月,ID,体重 as 今月体重 ,(select 体重 from テーブルA b where b.ID = a.ID and b.年月 = a.年月の1か月前) as 前月体重 from テーブルA a where a.年月 = 2011年02月; 年月のデータ型が分かりませんし、SQL Serverでの日付関連の処理に詳しくないので >a.年月の1か月前 この部分はご自身でうまく処理してください。

BAISYS
質問者

お礼

本当に助かりました。 年月の1か月前とかもなんとかなりそうです。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

with t as (select cast( replace( REPLACE( 年月, '年', '/'),'月', '/') + '1' as DATE) as dt, 年月,ID, 体重 from テーブルA) select t1.*,t2.体重 as 前月体重 from t t1 left join t t2 on t1.dt = DATEADD(MONTH,1,t2.dt) and t1.id = t2.id where t1.年月 ='2011年02月'

BAISYS
質問者

お礼

ありがとうございました。 SQLの世界が広がりました。

関連するQ&A

  • SQL文に関して教えてください。

    SQL文に関して教えてください。 SQLServer2005を利用し、マイクロソフトアクセスでadpを利用して構築を初めて行っています。 そこで、SQLServerのビューこのような事は可能でしょうか? (ビューをネストすれば出来るのですが、1つのSQL内で完結させたい) 色々探し、近い物はあったのですが、若干異なります。 フィールドがID1、ID2、ID3、date、txtと存在するとします。 ID1 ID2 date txt 1 1 20100801 test 2 1 20100901 Null 3 3 20100928 Null txtフィールドがNullのレコードを対象とし、dateが一番古い日付のレコード、nullのレコード数を 取り出す。結果としては以下が出れば正解です。 (グループ化が必要かと思います) ID1 ID2 date レコード数 2 1 20100901 2 やはり難しいでしょうか? 御教授願います。

  • SQL文で教えてください

    Left join と Right join の両方の機能をもった、一つのSQL文はどうしたらいいのでしょうか。 つまり、Left join は左側のテーブルを基準とし右にないものでも右の部分はNUllのままで抽出しますが、双方にあるものは統合して出力し、片方に無いものは、ない部分だけNullで、とにかく両方を抽出するというSQL文が書けないかと思案しています。

  • sqlのJoinでこんなこと出来ますか、

    sqlのJoinでこんなこと出来ますか、 当方初心者につき宜しく御願いします。 テーブルAにはIDがありIDはユニークです。テーブルBにはIDと項目がありIDは複数件存在します。項目には「あ」又は「い」、「う」、「え」、「を」が入っています。idに対して「あ」だけの時もあれば、「い」、と「う」が存在する時もあります。1件または複数件存在します。 条件に「あ」を抽出するようにして、「あ」がないときは存在するがテーブルBには存在するという結果を作りたいのです。 ID=1、あ ID=2、NULL という結果を作りたいのです。テーブルの双方に存在して、かつ「あ」であれば「あ」以外はNULLのレコードを作りたいのです。 説明が悪くて申し訳ありませんが宜しく御願い致します。

    • ベストアンサー
    • MySQL
  • SQL文で

    T-SQLを使用しています。 下記のような場合どのようにSQL文を組めばよいのでしょうか?Group byを使用すると思うのですが・・・ テーブル名:SampleTbl フィールド1:ID(プライマリ) フィールド2:Name(varchar(4)) 【名前】 フィールド3:UpTime(varchar(16))【更新時刻】 ※UpTimeの概要 yyyyMMddhhmmssss 2004/06/01 12:00:0000 中身 1,鈴木,2004060112000000 2,鈴木,2004060112050000 3,鈴木,2004060112100000 4,鈴木,2004060112200000 5,山田,2004060112000000 抽出条件: 同一の名前で更新日が5分以内の範囲で更新されているデータのみ抽出する 抽出結果 1,鈴木,2004060112000000 2,鈴木,2004060112050000 3,鈴木,2004060112100000 上記の抽出結果を取得するにはどのようにすればよいか、ご教授お願い致します。

  • SQL文の書き方(こんなこと出来ますか)

    テーブルA(ID、A,B,中身) テーブルa(A、コードの名前1) テーブルb(B、コードの名前2) ID、A、コードの名前1、B、コードの名前2、中身という風に結果を得たいのですが、Aがテーブルaに存在する、又はBがテーブルbに存在するものを出力したいのですがJoinが良く分かりません。aまたはbに存在しない時はコードの名前はNullにしたく、また抽出されテーブルAのレコードが重複しないようにしたいのですが、考えても分かりません。ご教授下さるようお願い致します。

    • ベストアンサー
    • MySQL
  • SQL文を教えてください

    SQL文を教えてください。 以下のテーブルがあります。 T入金 [ID] [名前] [金額] [入金日] 1, 山田, 25000, 2009/01/01 2, 佐藤, 5000, 2009/02/01 3, 山田, 30000, 2009/01/02 4, 佐藤, 45000, 2009/02/02 5, 佐藤, 10000, 2009/02/03 同じ人物で、入金額50000円に至ったときの入金日を 抽出したいと思っています。 上記データだと、 山田さんは入金日2009/01/02、 佐藤さんは入金日2009/02/02、 ということになります。 これを一つのSQL文で抽出できますでしょうか。 ご教授宜しくお願いいたします。 (Access2000のクエリで抽出しようとしていますが、Accessで無理ならSQL Server、MySQL、PostgreSQLでも可です)

  • 上位3位を求めるSQL文は?

    Mysqlのバージョンは4.0.14です。 次のようなテーブルがあります。 id   money ----------------- 1 2500 2 3200 1 1200 3 5000 4 2500 5 1200 IDでグループ化し、上位3件を抽出したいのです。 以下のように抽出したいのです。 Ranking id money 1 3 5000 2 1 3700 6 2 3200 SQLServerなら、上位何件かを取り出すには、 TOPを利用するようですが、 MYSQLにもそのようなものはないのでしょうか?

    • ベストアンサー
    • MySQL
  • sql文のwhere句について

    <環境>sqlserver SQLでパラメータが空白であれば全件取得、パラメータに値が設定されている場合には 条件にHITするデータを抽出したいのですが、一本のクエリで抽出することができるのでしょうか? 空白時パラメータは以下のとおり入ってきます。 @no="" …完全一致 @name="%%" …部分一致 例) SELECT * FROM テーブル WHERE (NO = @no) and ((@name IS NULL) OR (@name IS NOT NULL) AND (NAME LIKE @name)) NAMEは上記クエリにて取得できています。 NOのところはどのようにすればよいでしょうか?

  • ACCESS SQL文について

    現在データの更新をACCESSを使って行っているのですがSQLが上手く実行されなくて困っております。 テーブル1   ID  SUBID ------------------------   100  20000   100  20000   101  20000   200  20001   201  20001   201  10000   202  20000  テーブル2   kyuID  kyuSUBID  ID  subID ------------------------------   100   20000   111  11111   101   20000   111  11111   102   20000   123  12345   200   20001   123  12345   201   20001   555  55555   202   20000   777  77777 このようにテーブルにデータが入っており、テーブル1のIDとSUBID とテーブル2のkyuID とkyusubIDを紐づかせテーブル1のIDとSUBIDをテーブル2のIDとSUBIDにアップデートしたいと考えております。 結果 テーブル1   ID  SUBID ------------------------   111  11111   111  11111   111  11111   123  12345   555  55555   201  10000   777  77777 このような結果を求めたいと考えております。 私は頭が悪く解決できません。 わかる方、ご教授のほどよろしくお願いいたします。

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード