SQL文に関する質問

このQ&Aのポイント
  • SQLServer2005を利用し、マイクロソフトアクセスでadpを利用して構築を初めて行っています。ビューをネストすれば出来るのですが、1つのSQL内で完結させたいです。
  • フィールドがID1、ID2、ID3、date、txtと存在するテーブルの中で、txtフィールドがNullのレコードを対象にして、一番古い日付のレコードとnullのレコード数を取り出したいです。
  • この条件を満たすSQLの結果は以下のようになります:ID1が2、ID2が1、dateが20100901のレコードが2つ対象であるという結果です。
回答を見る
  • ベストアンサー

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 やはり難しいでしょうか? 御教授願います。

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

  • ベストアンサー
回答No.3

SELECT * FROM ( select [ID1],[ID2],[ID3],[date], (select COUNT(*) from @tb1 t2 where [txt] is null and t1.ID1=t2.ID1) as cnt, ROW_NUMBER() OVER (PARTITION BY ID1 ORDER BY [date]) as rowno from @tb1 t1 WHERE [txt] is null ) t3 WHERE t3.rowno=1

mikutaro
質問者

お礼

出来ました! ありがとうございました。 かなり勉強になりました!

その他の回答 (2)

  • bin_go
  • ベストアンサー率25% (2/8)
回答No.2

SELECT TOP 1 ID1, ID2, [date] , (SELECT COUNT(*) FROM table1 WHERE txt IS null GROUP BY txt) AS [レコード数] FROM table1 WHERE txt IS null ORDER BY [date] ASC こんなんでどうでしょう。

mikutaro
質問者

補足

bigcat1969さん、bin_goさんご回答ありがとうございました。 実践してみましたが、私の質問の仕方が悪く違った結果が出てしまったので、 もう一度御教授願います。 フィールドがID1、ID2、ID3、date、txtと存在するとします。 ID1, ID2, ID3, date, txt 1, 1, 2,20100801, test 1, 1, 3,20100901, Null 2, 3, 1,20100928, Null 2, 2, 2,20100905, Null 先ほどと同じくNullが対象データとし、ID1をキーとしdateが一番若いデータを取り出す ID1, ID2, ID3, date, レコード件数 1, 1, 3, 20100901, 1 2, 2, 2, 20100905, 2 上記のような結果を取得出来るSQLを書きたく思っています。 お忙しいところ申し訳ありませんが、よろしくお願いいたします。

回答No.1

select top 1 [ID1],[ID2],[date], (select COUNT(*) from @tb1 where [txt] is null) as cnt from @tb1 WHERE [txt] is null order by [date]

mikutaro
質問者

お礼

ありがとうございました。 申し訳ありません、質問の仕方が悪く、もう一度補足のように教えていただけないでしょうか?

関連するQ&A

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • SQL文にて・・・

    質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。

  • SQL

    テーブル情報 id start_dt end_dt --+----------+---------- 1 2014-01-07 2014-01-20 2 2014-01-08 Null 3 2014-01-09 Null 4 2014-01-10 Null 5 2014-01-11 Null を以下のSQL文の場合 select * from infomation where start_dt <= '2014/01/10' and (end_dt >= '2014/01/10' or end_dt is null) order by start_dt desc limit 3 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 2 2014-01-08 Null が取得されます。 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 1 2014-01-07 2014-01-20 の結果のように取得するSQL文をつくることは可能でしょうか? 何がしたいかというと ・start_dtが新しい順に並べる。 ・3件のレコードを取得する。 ・start_dtが'2014/01/10'より古いレコードを取得する。 ・end_dtが'2014/01/10'より新しいレコードがある場合は、Nullのレコードより優先する。 どうかお助けください。

    • ベストアンサー
    • MySQL
  • SQLの書き方について

    (1)の様なテーブルから結果を(2)の様にしたいのですが どのようなSQLを書いたら表示できるのかわかりません。 アドバイスなどをお願い致します。 (新たにView等を作成するなどでもかまいません。) (1)dept_id / item_id / day / time (カラム) 1111 / 0001 / 20090101 / 60 (レコード1) 1111 / 0001 / 20090102 / 30 (レコード2) 1111 / 0002 / 20090101 / 40 (レコード3) 1112 / 0001 / 20090101 / 30 (レコード4) (2)dept_id / item_id / time1 / time2 1111 / 0001 / 60 / 30 1111 / 0002 / 40 / 1112 / 0001 / 30 /

  • グループ化の際の文字列について

    SQLSERVER初心者でSQLをどうすればよいか 悩んでいます。アドバイスを頂ければと思います。 環境SQLSERVER2005 EXPRESS EDITION 下記のようなレコードでIDに対してどこかの 1項目にだけ文字列がはいっている形となっております。 (他の項目はNULLとなります。) これをIDでグループ化して1レコードにしたいのですが、 どのようなSQLで可能かアドバイス頂ければと思います。 ID   COL1   COL2   COL3   1   ABC    <NULL>   <NULL> 1   <NULL>   DEF    <NULL> 1   <NULL>  <NULL>   GHI 上記を下記のようにしたいのですが、 ID   COL1   COL2   COL3 1   ABC    DEF     GHI 以上アドバイスを頂けますと大変助かります。 よろしくお願いします。

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • SQL文で複数列の更新をしたい。

    SQL初心者です。 全レコードを対象にNULLが入ってるフィールドを半角スペースに更新したいのですが、SQL文で記述するにはどうしたらいいのでしょうか? 例えば 氏名 住所  電話番号    誕生日   血液型 田中 渋谷  03-1234-1111  NULL    A 佐藤 新宿  NULL      19450412  NULL 鈴木 池袋  03-1234-2222  19700522  B            ↓ 氏名 住所  電話番号    誕生日   血液型 田中 渋谷  03-1234-1111        A 佐藤 新宿          19450412   鈴木 池袋  03-1234-2222  19700522  B こんな感じです。 知恵をお貸しください。よろしくお願いいたします。

  • SQLServerを使い、SQL文の練習をしたい

    SQLServerを使い、SQL文記述の 練習をしたいと考えています。 (テーブルを作る、結合させる、レコードの合計を出す、などの内容) 自分のPC上で、SQL文を書いて 「わー2つのテーブルが結合した!」 「こっちのテーブルにはないレコードだけを追加できた!」というようなことを実感したいのみなのですが、この目的での利用でも、レンタルサーバーを借りるなどして「サーバー」を準備する必要があるのでしょうか? AccessでSQL文の面白さを知り、 他のデータベース関係のソフトにも触れてみたいと 思ったのが理由です。 よろしくお願いいたします。

  • SQLServer:SQL文でシングルクオテーションを混在させたフィールドを追加したい

    SQLServer2000を使用しております。 タイトルのとおりなのですが、 SQL文でシングルクオテーションを混在させたフィールドを追加するにはどのように記述すればよいのでしょうか。 レコードに混在させるには2つシングルクオテーションを記述すればよいというのはわかったのですが、 ALTER TABLE 等でフィールドを追加するときは、 この記述では追加が行われませんでした。 どなたかご教授の程、宜しくお願い致します。

  • グループ化したSQLの書き方について

    id,stpass,tokuten,branch,dateというフィールドをもつresultというテーブルを作成しました。 最高得点(フィールド名:tokuten)は、下記SQL(クエリーで作りました)でできます。 SELECT result.id, result.stpass, Max(result.tokuten) AS tokutenの最大 FROM result GROUP BY result.id, result.stpass; ただ、最高得点(Max(result.tokuten) AS tokutenの最大)を出したと同じレコードのそれ以外のフィールド(branch,date) を表示させるSQL(クエリー)がわかりません。 何方か、ご存知の方おられましたら、ご教授ください。