• 締切済み

仕様が難しくてSQL文が作れません(新人プログラマ

予約明細テーブルと貸出明細テーブルの2つがあります。 この2つのテーブルから以下の項目を抽出するSQL文がわかりません 貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先 ※予約明細と貸出明細には貸出期間開始日と貸出期間終了日があります。 貸出期間:上記明細の貸出期間(貸出先で抽出した貸出期間開始日、貸出期間終了日) 会場:予約明細の時のみ上記明細の会場 担当 上記明細の登録担当者 という項目を抽出するSQL文がわかりません 自分なりに考えた結果が以下のSQL文です。新人プログラマのため間違っていると思うので ご指摘願います。 SELECT 貸出先, 貸出期間開始日~貸出期間終了日 AS 貸出期間, 会場, 担当 FROM 商品 LEFT JOIN 予約明細 ON 商品コード = 商品コード (商品テーブルと予約明細テーブルは商品コードで結合します) LEFT JOIN 貸出明細 ON 商品コード = 商品コード (商品テーブルと貸出明細テーブルは商品コードで結合します) WHERE ここからがまったくわかりません。 SQL文だけでは抽出する事は不可能なのでしょうか VB.netで開発しているのですがVB側で処理しなければいけない 項目もありますでしょうか SQL文(とVB)のコードでのご回答宜しくお願いいたします。 環境 VB2005 SQLServer2005

みんなの回答

  • sppla
  • ベストアンサー率51% (185/360)
回答No.4

No1、No2の方の言いたいことはわかる(苦笑) 酒飲んでいるし、SQL文自体使うDBMS依存なので的確なことは言えないがご参考までに。 (私のスタイルはSQL Server系で、かついちいち検証する気がないのでうろ覚えでの記載です。) まず、あなたのSQL文では「商品」テーブルなるものが登場していますが、これはSELECTで抽出する列、WHERE句の条件に関わらないなら不要です。 また、LEFT JOINを使うかINNER JOINなのかも検索の条件次第で使い分けが必要です。 >貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先 >の仕様SQLがとくにわかりません システム日付を取得する関数をGETDATE()としますと、この部分はまず直近の貸出期間終了日を検索するには以下のようになります。(貸出明細テーブルの貸出期間終了日が直近のものを直近の貸出先と仮定しています) SELECT MAX(貸出期間終了日) FROM 貸出明細 WHERE 貸出期間終了日 <= GETDATE() これで直近の貸出終了日を求めたなら、それに対応する貸出先は(貸出明細テーブルに貸出先フィールドがあると仮定しています)サブクエリーを使用して SELECT 貸出先, 貸出期間終了日 FROM 貸出明細 WHERE 貸出期間終了日 = (SELECT MAX(貸出期間終了日) FROM 貸出明細 WHERE 貸出期間終了日 <= GETDATE()) ※たぶんこんな感じだと思うが、自分で仕事でやるときはSQLを実際に試して検証するけれど、今ははしょっているので無保障です。 ここまでいけばあなたのSQLから類推すると、直近に貸し出した先の情報を取りたいようなので (会場、担当は予約明細テーブルにあると仮定。貸出先、貸出期間終了日、商品コードは予約明細、貸出明細テーブルにあると仮定。期間を求める関数をDATEDIFF()とする) SELECT 予約明細.貸出先, DATEDIFF(day, 予約明細.貸出期間開始日, 予約明細.貸出期間終了日) AS 貸出期間, 予約明細.会場, 予約明細.担当 FROM 予約明細 INNER JOIN 貸出明細 ON 予約明細.貸出先 = 貸出明細.貸出先 AND 予約明細.貸出期間終了日 = 貸出明細.貸出期間終了日 AND 予約明細.商品コード = 貸出明細.商品コード INNER JOIN (SELECT 貸出先, 貸出期間終了日, 商品コード FROM 貸出明細 WHERE 貸出期間終了日 = (SELECT MAX(貸出期間終了日) FROM 貸出明細 WHERE 貸出期間終了日 <= GETDATE()) AS K ON 貸出明細.貸出先 = K.貸出先 AND 貸出明細.貸出期間終了日 = K.貸出期間終了日 AND 貸出明細.商品コード = K.商品コード とこんな感じでサブクエリー使えば行けるんじゃないかと思ったが、自信はないです。 それと、商品テーブルを関与させるならSELECT文に商品コードや商品名も出すのだろうなと思います。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

#1です。 あのね、「テーブル構造は社外秘ですから」は無いでしょ。 だれも構成をまんま書いてくれとは期待してませんよ。 デフォルメしてかまわない。結合・WHERE条件のモトネタがわからないとどうしようも無いから。 > 予約明細テーブルと貸出明細テーブルの2つがあります。 > この2つのテーブルから以下の項目を抽出するSQL文 と書きながら > FROM 商品 3つ目のテーブルが登場してるし。 #2さんがズバリ指摘なさったが、仕様がわからないままでは誰も書けないよ。 上司or先輩の要求でSQL文書くなら、わからない点はその人に聞くしかないよ。 こういうサイトの使い方も含めてちゃんと相談してごらん。 もう一度書くけど、Selectする列はどのテーブルから取得するのか、整理してみて。 JOINしてる以上、何かしらのレコードは返るでしょ。 デフォルメで良いからテーブル構造を示さないと、WHERE条件をどうするか、考えようが無い。 「SQL文は発展途上だが、ACCESSならお任せあれ」だったら、ACCESSでODBCリンクテーブル作って クエリで頑張ってごらん。望む結果が得られたら、デザインビュー>SQLビューで読めるから。

  • Brian12
  • ベストアンサー率25% (187/723)
回答No.2

>仕様が難しくてSQL文が作れません  ”仕様が難しい”のではなく、仕様が明確でないのです。  提示された仕様は明確であったかも知れませんが、質問内容に記載の内容は明確でありません。  ANo.1のお礼に書かれていましたが、「言ってることがよくわからない」のです。それは、理解に重要なキーワードが無いのです。裏返すと、仕様にキーワードが書かれていても、見逃しているのでしょう。  何がキーワードかを知るには、正しく動作している仕様書とそれで作成されたコードを照らし、消込みをしてみる事です。仕事を始めてどれほど立っているかわかりませんが、分からないことを聞くのが恥ずかしくて知ったような顔をしていると、ドンドン深みにハマッテしまいますよ。まずは、分からないことが何処にあるのかが言えなければ、聞いても教えてもらえません。地道に仕様書の文言とコードの対応を消込んで見てください。それがスラスラとできるようになれば、大丈夫です。  でも、この消込みが出来ないようであれば、この仕事は向かないのかも知れません。本来は身近の人に教えてもらえなければ、仕事になりませんよ。  頑張ってね。  

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

テーブル[商品]・[予約明細]・[貸出明細]の構造は? 貸出期間は演算で算出できるような列構造? select文に登場する列名に、テーブル名を加えて記述してみて。 商品テーブルの列[商品コード]だったら、 商品.商品コード のように。

tkwavek
質問者

お礼

詳細なテーブル仕様は社外秘のためここでは掲載できません 貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先 の仕様SQLがとくにわかりません また貸出期間は 貸出期間開始日と貸出期間終了日から計算してもとめるわけではなく 仕様をみたす 貸出期間開始日~貸出期間終了日というふうに記述するものです 詳細なテーブル仕様を掲載できなくて申し訳けありません。 ここに掲載した仕様だけでSQL文を組んでいただけないでしょうか。 経験から推測してこうじゃないかという憶測も多少含まれていてもかまいません。 説明がうまくできなくて本当にもうしわけありません。会社でも言ってることが よくわからないと先輩社員に怒られている日々です。 お忙しい中回答いただきありがとうございました。

関連するQ&A

  • 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.担当コード

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • SQL文 グループ集計TOPに対する明細

    すみません、教えてください。 得意先の売上額上位10社のそれぞれについて、仕入合計額上位10商品のリストを出力するSQL 文をがわからなくて困っています。 できれば、一般的なSQL文(SQL92)でお願いします。 テーブルは、下記の2つです。 -------------------------------------------- ・t_売上明細  売上日  得意先コード  商品コード  売上金額 ・t_商品マスタ  商品コード  仕入単価 <出力>====================================== 得意先コード, 売上合計,商品コード,仕入額合計 -------------------------------------------- C3 \300100    A08 \32500     A04 \31000     ~~~    A10 \30000(Top10) C2 \200200    A05 \22500    A04 \21000     ~~~     A10 \20000(Top10) ~~~ ~~~ C10 \1000(Top10)    A97 \500    A14 \100    ~~~    A96 \10(Top10) ================================

  • 【SQL】SELECT文

    こんにちは。OracleのSQLを勉強中の者です。 SELECT文について質問させてください。 下記のテーブルから購入フラグがすべて「1」のユーザ名を抽出したいのですが、SQL文をご教授いただけますでしょうか。 テーブル名:商品購入テーブル ユーザ名   商品名    購入フラグ ---------- ---------- -------------- 001      AAA       1 001      BBB       1 001      CCC       0 002      DDD       1 003      AAA       1 003      EEE       1 004      CCC       0 このテーブルからですと、002と003のユーザが抽出される形となります。 以上、よろしくお願いいたします。

  • SQL文ニ関して

    下記の3つのテーブルから下記フィールドを結合するSQL文を教えてください。 条件 ※SQL*PLUSを使用 ※店舗コードと営業日は共通(フィールドCDは別名) ※掛金額・商品券金額・クレジット金額はそれぞれフィールド数が10個(種類別) ※掛金額・商品券金額・クレジット金額はそれぞれ10個のフィールドを合計し  その合計したフィールドのみを表示させる。別名をつける。 ※必要な店舗コードのみを抽出する。  ※エディタにSPOOLする。 テーブル(1) フィールド名 1 店舗コード 2 営業日 3~12 掛金額 13~22 商品券金額 23~32 クレジット金額 テーブル(2) フィールド名 1 店舗コード 2 営業日 3 現金売上金額 テーブル(3) フィールド名 1 店舗コード 2 営業日 3 現金過不足 宜しくお願いします。

  • 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でも可です)

  • 要求を満たすことのできるSQL文を教えてください

    現在、売上の明細を明細IDごとにグループ化し合計値を表示させるプログラムを開発中です。 以下のような要件を満たすSQL文を教えてください。 【もともとの売上の明細のテーブル】 明細ID | NAME | KINGAKU 001  |商品A | 1000 001 |商品B | 500 001 |商品C | 300 002 |商品A | 1000 002 |商品D | 1500 【グループ化後のテーブル】 明細ID | NAME | KINGAKU 001 |商品A | 1800 002 |商品D | 2500 ・明細IDごとに金額を合計する。 ・NAMEの列については、その明細IDの中で最大の金額の商品名を入れる。 ※現在、明細IDごとに金額を合計するのはできているのですが、  もう1つの要件をどのようにすれば達成できるのか分からない  状況です。要件を満たすことのできるSQL文をぜひ教えてください。 よろしくお願いいたします。

  • VB SQL文について

    VB6.0(SP5) XP SQL Sever7.0を使用しています。 テーブルからSQLより以下の条件で抽出しようとしています がいいSQL文が浮かびません。 TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | | 20030301 | 250 | | 20030302 | 220 | | 20030302 | 225 | | 20030303 | 230 | ----------------------- 上記の内容で、一度読み込んで、内部テーブルに格納 したとします。TableAにデータ6、7が追加後に再度、 TableAを読んだときにデータ6、7だけ抽出したいのです が、いい方法ありますか? TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | 1 | 20030301 | 250 | 2 | 20030302 | 220 | 3 | 20030302 | 225 | 4 | 20030303 | 230 | 5 | 20030303 | 240 | 6  ← 抽出したいデータ | 20030304 | 100 | 7  ← 抽出したいデータ ----------------------- ルール sDate :重複することあるが昇順になっている。 nNumber:sDateをキーにすると重複しない。 sDate+nNumberでみると昇順になっている。 よろしくお願いします。

  • デルファイでのSQL文について

    まだ初心者なのでよく分かりません。SQL文について教えてください。 テーブル名:table1 データ:   コード   日付     種類   備考 (1) 1111   2003/12/11  book  AAA (2) 2222   2003/11/10  pencil BBB (3) 2222   2003/12/10  pencil CCC (4) 2222   2003/12/20  cap   DDD 上のようなデータがあった場合、コードと種類が同じで日付が最新のデータを取りたいのですがSQL文でできるでしょうか? 上の場合だと(1)と(3)と(4)のデータを抽出したいのです。GROUP BYですると備考がとれませんでした。 どうぞよろしくお願いします。   

専門家に質問してみよう