
※連投すみません。削除も修正もできなかったので連投になってしまいました。
一番重要な説明をコピペミスしてしまいました。
明日になれば削除できるようなので古い方は明日削除致しますm(__)m
---ここから---
今日は9/24という想定で各部署の10営業日前の日付を取得したいのですが良い方法が思いつきません。
(ここ↓を参考にしたらできそうな気がしましたが私の頭では無理でした。。。)
http://oshiete.goo.ne.jp/qa/6677209.html
【休日テーブル】
部署コード, 休日
-----------------
busyo1, 9/13
busyo1, 9/14
busyo1, 9/20
busyo1, 9/21
busyo1, 9/23
busyo2, 9/7
busyo2, 9/14
busyo2, 9/21
busyo3, 9/20
【結果】(各部署の10営業日前の日付)
部署コード, 日付
-----------------
busyo1, 9/9
busyo2, 9/12
busyo3, 9/13
このような「発想の転換」が必要な感じのSQLが本当に苦手です。
全然思いつかずに今日も半日を浪費してしまいました。
何かコツのようなものがあるのでしょうか。
お礼は明日の夜になってしまいますが何卒よろしくお願いします。

No.2ベストアンサー
- 回答日時:
あまり深く考えていませんので、件数が多いと使いものにならないかもしれません。
with 休日テーブル as (
select 'busyo1' 部署コード, date'2014-09-13' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-14' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-20' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-21' 休日 from dual
union all select 'busyo1' 部署コード, date'2014-09-23' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-07' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-14' 休日 from dual
union all select 'busyo2' 部署コード, date'2014-09-21' 休日 from dual
union all select 'busyo3' 部署コード, date'2014-09-20' 休日 from dual
)
, 日付 as (
select trunc(/* sysdate */ date'2014-09-24' - 1) - level 日付
from dual
--とりあえず過去30日分の日付
connect by level <= 30)
select 部署コード, 日付
from (
select 部署コード, 日付, count(*) over(partition by 部署コード order by 日付 desc) cnt
from (select distinct 部署コード from 休日テーブル) 部署マスタ
cross join 日付
where not exists (
select * from 休日テーブル where 部署マスタ.部署コード = 休日テーブル.部署コード and 日付.日付 = 休日テーブル.休日
)
)
where cnt = 10;
こまかい説明を書く時間がないので、そこはSQLから読みとってください。すみません・・・
いえいえ、SQLから自分で読み解くのは当たり前だと思っています。
教えていただけただけでも大変ありがたく感じております。
さすがにはじめて見る記述だらけで解読に手間取りましたが
おかげさまで無事に一日を終えることができました。
ありがとうございました。
No.1
- 回答日時:
元のデータは何件あるんですか?
レコード数ではなくて、日付の数。
Excelにでもコピペして、Update文を作るほうが簡単かも。
この回答への補足
元のデータの件数は過去20年分は入っているそうなので1部署あたり約2400件です。
(もう少し少ない部署もあります)
ちなみに部署は約100種類あります。
アドバイス頂いた「Excelにコピペ」という意味がよくわからずに書いてしまいますが、このSQLは大規模なシステムの1部で使われます。
その画面の1つのそのまた1つの項目に使われるものなので、もしユーザ様にExcelを使わせるような想定をされているのならそれは無理なのです。
(少し寝たらひらめくかな、と期待しましたが朝になっても全くひらめきません。困りました。。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
沿線コード
-
CREATE テーブルでの複数外部...
-
10営業日前の日付を取得したい...
-
SQLの実行結果が異なる
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
OracleのSQL*PLUSで、デー...
-
Accessで別テーブルの値をフォ...
-
Date型にNULLをセットしたい V...
-
access2003で学籍番号から生徒...
-
SELECTの結果で同一行を複数回...
-
iserease のDB2 UDBに対してODB...
-
確認ダイアログを出さないでレ...
-
重複をせずに2つのフィールドを...
-
MERGE文を単体テーブルに対して...
-
最新の日付とその金額をクエリ...
-
VBScript(WSH)でのランダムア...
-
ACCESSで大量の更新を行うと「...
-
JOINでの結果取得 サブクエリ...
-
select句副問い合わせ 値の個...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
沿線コード
-
SQLの実行結果が異なる
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
【SQL】登録されているかを比較...
-
ヤマト急便のチェックデジット...
-
困っています。ORACLE_SQL 複数...
-
SQLの質問です。
-
SQLにて縦を横へ展開
-
SQLの書き方
-
10営業日前の日付を取得したい...
-
平成20年 春期 基本情報技術者 ...
-
SQLについて
-
SQLの集約の方法
-
同一コード毎に最新の名称を取...
-
Oracleビュー:同じ意味で異な...
-
オラクル 名称をコードに変換
-
SQL 特定のカラムが最大値のレ...
-
SQLについて
おすすめ情報