電子書籍の厳選無料作品が豊富!

予約明細テーブルと貸出明細テーブルの2つがあります。
この2つのテーブルから以下の項目を抽出するSQL文がわかりません
貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先
※予約明細と貸出明細には貸出期間開始日と貸出期間終了日があります。

貸出期間:上記明細の貸出期間(貸出先で抽出した貸出期間開始日、貸出期間終了日)

会場:予約明細の時のみ上記明細の会場

担当 上記明細の登録担当者


という項目を抽出するSQL文がわかりません

自分なりに考えた結果が以下のSQL文です。新人プログラマのため間違っていると思うので
ご指摘願います。


SELECT
貸出先,
貸出期間開始日~貸出期間終了日 AS 貸出期間,
会場,
担当
FROM 商品
LEFT JOIN 予約明細 ON 商品コード = 商品コード (商品テーブルと予約明細テーブルは商品コードで結合します)
LEFT JOIN 貸出明細 ON 商品コード = 商品コード (商品テーブルと貸出明細テーブルは商品コードで結合します)
WHERE

ここからがまったくわかりません。

SQL文だけでは抽出する事は不可能なのでしょうか
VB.netで開発しているのですがVB側で処理しなければいけない
項目もありますでしょうか


SQL文(とVB)のコードでのご回答宜しくお願いいたします。
環境
VB2005
SQLServer2005

A 回答 (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文に商品コードや商品名も出すのだろうなと思います。
    • good
    • 0

#1です。


あのね、「テーブル構造は社外秘ですから」は無いでしょ。
だれも構成をまんま書いてくれとは期待してませんよ。
デフォルメしてかまわない。結合・WHERE条件のモトネタがわからないとどうしようも無いから。

> 予約明細テーブルと貸出明細テーブルの2つがあります。
> この2つのテーブルから以下の項目を抽出するSQL文
と書きながら
> FROM 商品
3つ目のテーブルが登場してるし。

#2さんがズバリ指摘なさったが、仕様がわからないままでは誰も書けないよ。
上司or先輩の要求でSQL文書くなら、わからない点はその人に聞くしかないよ。
こういうサイトの使い方も含めてちゃんと相談してごらん。


もう一度書くけど、Selectする列はどのテーブルから取得するのか、整理してみて。
JOINしてる以上、何かしらのレコードは返るでしょ。
デフォルメで良いからテーブル構造を示さないと、WHERE条件をどうするか、考えようが無い。

「SQL文は発展途上だが、ACCESSならお任せあれ」だったら、ACCESSでODBCリンクテーブル作って
クエリで頑張ってごらん。望む結果が得られたら、デザインビュー>SQLビューで読めるから。
    • good
    • 0

>仕様が難しくてSQL文が作れません


 ”仕様が難しい”のではなく、仕様が明確でないのです。
 提示された仕様は明確であったかも知れませんが、質問内容に記載の内容は明確でありません。

 ANo.1のお礼に書かれていましたが、「言ってることがよくわからない」のです。それは、理解に重要なキーワードが無いのです。裏返すと、仕様にキーワードが書かれていても、見逃しているのでしょう。

 何がキーワードかを知るには、正しく動作している仕様書とそれで作成されたコードを照らし、消込みをしてみる事です。仕事を始めてどれほど立っているかわかりませんが、分からないことを聞くのが恥ずかしくて知ったような顔をしていると、ドンドン深みにハマッテしまいますよ。まずは、分からないことが何処にあるのかが言えなければ、聞いても教えてもらえません。地道に仕様書の文言とコードの対応を消込んで見てください。それがスラスラとできるようになれば、大丈夫です。

 でも、この消込みが出来ないようであれば、この仕事は向かないのかも知れません。本来は身近の人に教えてもらえなければ、仕事になりませんよ。

 頑張ってね。
 
    • good
    • 0

テーブル[商品]・[予約明細]・[貸出明細]の構造は?


貸出期間は演算で算出できるような列構造?

select文に登場する列名に、テーブル名を加えて記述してみて。
商品テーブルの列[商品コード]だったら、 商品.商品コード のように。
    • good
    • 0
この回答へのお礼

詳細なテーブル仕様は社外秘のためここでは掲載できません

貸出先:予約明細と貸出明細のうち直近(システム日付からの)の貸出先
の仕様SQLがとくにわかりません
また貸出期間は
貸出期間開始日と貸出期間終了日から計算してもとめるわけではなく
仕様をみたす
貸出期間開始日~貸出期間終了日というふうに記述するものです




詳細なテーブル仕様を掲載できなくて申し訳けありません。
ここに掲載した仕様だけでSQL文を組んでいただけないでしょうか。
経験から推測してこうじゃないかという憶測も多少含まれていてもかまいません。


説明がうまくできなくて本当にもうしわけありません。会社でも言ってることが
よくわからないと先輩社員に怒られている日々です。

お忙しい中回答いただきありがとうございました。

お礼日時:2012/11/04 12:19

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