

社員のデータをテーブルに格納しました。
テーブルは下記のようになっています。inが入社年。outが退社年です。退社年が空白の社員は在籍中を表しています。
テーブル名:office
nama(VARCHAR型)|in(INT型)|out(INT型)
田中|2003|2008
加藤|1995|2001
桐谷|2009|
やりたい事が二点あります。
(1)「2007年に在籍した社員」と指定した場合。上のテーブルでいうと田中のデータを抽出。
「in<2007 AND out>2007」このような指定をすればいいのかと思ったのですが、空白(現在も在籍中)の場合どうすればいいのか分かりません。
(2)「在籍年数が4年以上6年未満の社員」と期間を指定した場合。上のテーブルでいうと田中と桐谷のデータを抽出。
この場合SQL文はどのようにすれば良いでしょうか?
このテーブルのデータの書き方だと難しいでしょうか?難しければもっとこうした方が良いなどアドバイスを頂けると幸甚です。
ご存知の方いらっしゃいましたらご教示ください。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
create table office(name varchar(10),`in` int,`out` int default 2999);
insert into office values('田中',2003,2008),('加藤',1995,2001),('桐谷',2009,default)
//2007年在籍
select * from office where 2007 between `in` and `out`; //田中さん
//2010年在籍
select * from office where 2010 between `in` and `out`; //桐谷さん
//在籍年数が4年以上6年未満の社員
select * from office where least(year(now()),`out`)-`in`+1 between 4 and 6 ; //田中さんと桐谷さん
回答ありがとうございます。
データはphpmyadminで入力しているのですが、デフォルト値を「2999」に設定しても上手く反映されず、結局在籍中の社員は「out」の数字を「2999」と直接入力しました。
そしてご教示頂いたSQL文で実行してみたら無事できました。
色々とありがとうございました。勉強になりました。
No.2
- 回答日時:
こういうのはoutのデフォルト値を2999などにしておけば済む話です
そうでないばあいintのデフォは0になるのでこれもあまり美しくない
またint値にnullを生かすのは可能な限りやめたほうがいい
ちなみに年だけで期間を表すと月ズレするのであまりいい管理方法とは言えません
>「在籍年数が4年以上6年未満の社員」
この条件は「在籍年数が4年以上6年未満の『すでにやめた』社員」と
「在籍年数が4年以上6年未満の『在籍中の』社員」に分けられますが
別に管理しなくてもいいんでしょうか?
回答ありがとうございます。
>こういうのはoutのデフォルト値を2999などにしておけば済む話です
そのようにしました。
色々勉強になりました。ありがとうございました。
No.1
- 回答日時:
(1)
select * from office where in <= 2007 and (out >= 2007 or out is null);
(2)
select * from office where (in <= (year(now()) -4) and in > (year(now()) -6) and out is null) or ((out - in) >= 4 and (out - in) < 6);
この回答への補足
回答ありがとうございます。
(1)と(2)を先ほど実行してみたのですが、また私の説明が足りなかったかもしれません。
空白(現在在籍している社員)の場合は今年の年(2014年)が入力されているのと同じ処理ができればと思っています。
(1)ですと例に出した「2007年に在籍した社員」と指定した場合は田中のデータが抽出できるのですが、「2010年に在籍した社員」と指定した場合は現在在籍していて退社年が空白の桐谷のデータは抽出できません。
退社済みの社員のみが対象となってしまっているようです。
(2)も上記と同じです。データは抽出できるのですが、退社済みの社員が対象となってしまっています。
この問題は現在在籍している社員の退社年に今年の年を記入すれば解決すると思うのですが、別に「○○年に退社した社員」という指定で抽出もしているので在籍しているにもかかわらず退社している社員として抽出されてしまうのでできません。
こういったものはやはり無理があるでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
副問合せを使わずにUNIONと同様...
-
PRIMARY KEYのコピー
-
Accessの構成をコピーしたい
-
トランザクションテーブルの設...
-
ADO+ODBCでテーブルに接続する...
-
2つのテーブルをLIKE演算子のよ...
-
複数選択か?単数選択か? テ...
-
SELECT INTOで一度に複数の変数...
-
PostgreSQLのtimestamp型で時間...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
pandasでsqlite3にテーブル作成...
-
truncate tableを使って複数の...
-
UPDATEで既存のレコードに文字...
-
dumpでインデックスだけ抜きたい
-
エラーを起こす方法
-
MySQLで数字の値のもののみを取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
-
2つのテーブルをLIKE演算子のよ...
-
ExcelのMatch関数のようなもの...
-
改行を含んだデータのインポート
-
PRIMARY KEYのコピー
-
ADO+ODBCでテーブルに接続する...
-
ACCESSのVBAにてExcelに行...
-
同一テーブル内での比較(最新...
-
(SQL)日数の計算
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
必要なテーブルの個数について。
-
複数選択か?単数選択か? テ...
おすすめ情報