MSDE FunClub
Microsoft Data Engine FunClub
MSDE初心者向けメーリングリスト過去ログ[1560]番
 
[TOP]>[MSDE初心者向けメーリングリスト過去ログ(1560番)]>[ウィンドを閉じる]
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
ウィンドを閉じる
MSDE/SQLServer FAQ
MSDE / MSDE2000 
技術情報サポート
初心者向け
メーリングリスト
過去ログの表示
技術者向け
メーリングリスト
過去ログの表示
メーリングリスト
活動状況の
表示
MSDE TOP メニュー
MSDEトップメニューに移動します
 

 
Re: SQL の記述について

Date: Tue, 26 Jul 2005 11:23:22 +0900
From: "Akira Horikawa" <who@example.ne.jp>


堀川です

-----Original Message-----
From: Kohichiroh Ohta [mailto:who@example.co.jp]
Sent: Tuesday, July 26, 2005 10:09 AM
To: who@example.ne.jp
Subject: [ml-msde-beg:01558] Re: SQL の記述について


>> 最初に例示されたテーブルの列構成が、
>>             少々おかしいのでは?
>> という意味です。
>正規化処理のことですね。

正規化処理の話ではありません。

一番最初(記事番号1544 )のメールの中で、

>これは[売上ID]が一番大きい値の行を
>最新の売上とみなしています
>もっとも新しい日付の1行を抽出ということになると
>このような書き方では抽出できないと思います。
>古い日付のものを後で入力する場合もあるからです

というように話されておりますので、このテーブルが抱える
問題点は自覚していると思います。

このテーブルでは、実務ベース上で発生する業務を正しく
表現(記録)することはできないわけです。

実務社会では、例えば、
   今日の売上情報のレコードデータ入力を明日に入力する
というような作業があるかもしれません。

あるいは一度入力されたレコードの日付けを、より新しい日付け
に修正するかもしれません(売上計上日の修正)。

そのようなことをされると、このテーブルが成り立つ前提条件である、

  『[売上ID]が一番大きい値の行を最新の売上とみなす』
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

が、成立しなくなります。

ですから、テーブル設計を変更しないのであれば、この仮定が常に
成立するような業務運営(レコード入力)にしなければいけません。

テーブル設計は、実務レベルで発生するデータを忠実に管理記録
するものです。

ただ当然ながら、100%正しく表現することは難しいので、ある程度の
モデル化をします。

そのモデル化のため、前提条件やデータ入力手順に関する制約などが
必要となります。
それらを付けたとしても、業務運営(レコード入力)に支障を来たすようで
あれば、テーブル設計の失敗だと思います。

この例では、『今日の売上情報を明日に入力する』という作業を禁止させる
ことはできない、頻繁に起こり得る事象です。

1年に1度か2度しか起こらない事象に対して、テーブル設計を修正
するのは、コスト面や労力などから言って、大変だと思います。
そのような場合は、データ入力手順を変更したり、逃げ道を用意するのが
良いでしょう。

ただ頻繁に発生する事象に関しては、テーブル設計上、対応できないと
ダメです。



>SELECT 得意先ID, MAX(日付) FROM 備考 GROUP BY 得意先ID
>
>これで、備考テーブルの各得意先毎の日付の最大値は求められます。
>しかしその日付が入っている行をどうやって抽出するのかがわかりません。

例えば
SELECT * FROM 備考
  WHERE(
       日付 IN ( SELECT MAX(日付) FROM 備考 GROUP BY 得意先ID )
  )

のようなSQL文を実行すると、
          各得意先IDの最大日付に一致するレコードの検索
になります。
これでは、得意先IDが異なっていても、最大日付と同じ日付けを持っている
レコードがあれば、すべて表示されます。

ですから、最大日付けだけではなく、その最大日付けのを持つ得意先IDの
情報も、検索のときに必要となることがわかります。

SELECT * FROM 備考
     INNER JOIN (
         SELECT 得意先ID ,  MAX(日付)  AS MAX日付
              FROM 備考   GROUP BY 得意先ID
    ) 備考MAX
ON 備考.得意先ID=備考MAX.得意先ID
     AND 備考.日付 = 備考MAX.MAX日付
 ORDER BY  備考.得意先ID

このようなSQL文にすると、得意先IDごとに最大日付けのレコードが表示されます。
ただ、同一日に複数レコードの入力があれば(その日付けが最大日のとき)、
複数レコードの表示となります。

一番直近の備考のレコードを、1レコードだけ表示することはできません。


------------------------------------
(株)日本技術ソフト開発
        堀川 明  (Akira Horikawa)
    07月26日(火曜日) 11時22分記
        mailto:who@example.ne.jp
        http://www.horikawa.ne.jp/msde/





[MSDE/SQLServerに関して、今、どんなことにお困りですか?]
よろしければお困りの内容を、電子メールで教えて下さい。
質問を電子メールで作成する


[ウィンドを閉じる]

[MSDE/SQLServer FAQ ]

[MSDE / MSDE2000 技術サポート情報一覧]

MSDE TOP ページに移動する

 
 
 
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。