日付と休日フラグの2つのフィールドを持つ
カレンダーテーブルを使用して
翌営業日までの日数を求めるSQLを教えていただけ
ますでしょうか。
使用環境はaccess2007です。

カレンダーテーブル
date flg
---- ---
4/1 0 → 3(翌営業日まで3日間)
4/2 1 → 2(翌営業日まで2日間)
4/3 1 → 1(翌営業日まで1日間)
4/4 0 → 1(翌営業日まで1日間)
4/5 0 → 1(翌営業日まで1日間)

よろしくお願いいたします。

A 回答 (1件)

こんな感じでどうでしょうか。



SELECT
date
, (SELECT MIN(date) FROM カレンダーテーブル AS T2 WHERE T1.DT < T2.DT AND T2.FLG = 0) - T1.date AS 日数
FROM
カレンダーテーブル AS T1;

ACCESSの環境がないので動作確認はできていません。
    • good
    • 0
この回答へのお礼

yamada_g様
素早いお返事ありがとうございます。
ばっちり、期待通りに動きました。

サブクエリ―は正解を示されると「そうだよなー」と
納得がいくのですが、いざ実戦になると、なかなか
自力では使いこなせません。。。
もっと勉強に励まないとですね!

本当に助かりました!ありがとうございました。

お礼日時:2011/04/18 19:07

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q10営業日前の日付を取得したい(修正)

※連投すみません。削除も修正もできなかったので連投になってしまいました。
一番重要な説明をコピペミスしてしまいました。
明日になれば削除できるようなので古い方は明日削除致します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が本当に苦手です。
全然思いつかずに今日も半日を浪費してしまいました。
何かコツのようなものがあるのでしょうか。

お礼は明日の夜になってしまいますが何卒よろしくお願いします。

※連投すみません。削除も修正もできなかったので連投になってしまいました。
一番重要な説明をコピペミスしてしまいました。
明日になれば削除できるようなので古い方は明日削除致しますm(__)m

---ここから---
今日は9/24という想定で各部署の10営業日前の日付を取得したいのですが良い方法が思いつきません。
(ここ↓を参考にしたらできそうな気がしましたが私の頭では無理でした。。。)
http://oshiete.goo.ne.jp/qa/6677209.html

【休日テーブル】
部署コード, 休日
-----------------
busyo1,   9/13
b...続きを読む

Aベストアンサー

あまり深く考えていませんので、件数が多いと使いものにならないかもしれません。

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から読みとってください。すみません・・・

あまり深く考えていませんので、件数が多いと使いものにならないかもしれません。

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' ...続きを読む

QSQL Server 2005 Expressで営業日の数え方

Visual Web Developer 2005 Express始めたばかりの初心者です。

簡単な受注管理のDBを作成しているのですが、営業日の数え方について教えてください。
test01テーブルに受注日という項目があり、経過日数という項目で受注日と今日の日付の差を出しています。

SELECT (int,GETDATE()-jutyubi) AS Expr1,jutyubi FROM test01

受注日から今日までの差を表示するのではなく、受注日から今日までの営業日を求めたいのですがどのようにすればよいでしょうか。
営業日は土日の除いて考え、国民の休日が設定できればよりいいです。

エクセルのNETWORKDAYS関数のようなイメージをしています。よろしくお願いいたします。

Aベストアンサー

曜日はこれで返り値を得て処理します
DAYOFWEEK関数
http://msdn2.microsoft.com/ja-jp/library/aa337257.aspx

Q日数算出SQL

すみません教えてください。
DB→Oracle9iで「日付A」と「日付B」の間の日数を表示させようとしているのですが、うまくいきません。
参考書などでは、「Months_Between関数」でも試してみたのですが、うまくいきません。単純なやりかたあればおしえていただきたいのですが、よろしくお願いいたします。

Aベストアンサー

こんにちは。

Months_Betweenは、差分を月で表す場合に使います。
この場合は1ヶ月未満は小数になってしまいますね・・・。

日付だけでいいなら単純に引き算します。
SELECT to_date(日付A)-to_date(日付B)
FROM テーブル
です。
(^^ゞ

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QINSERT時に発番を行いたい

ATBLからBTBLへのINSERT時発番を行いたい

<環境>
SQLSERVER 2008

<ATBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBLのデータ>
CD   NO  NAME
0011太郎
0013次郎
0015三郎

BTBLをATBLへINSERTしたいのですが、この時、NOを1から再付番したいのです。
INSERTクエリで一発で更新できますでしょうか?
ご教授お願いします。

Aベストアンサー

row_numberで1からの連番ふれるよ

INSERT INTO ATBL(CD, NO, NAME)
SELECT CD, row_number() OVER(ORDER BY CD) AS NO, NAME FROM BTBL

参考URL:http://msdn.microsoft.com/ja-jp/library/ms186734.aspx

QSQLで部分的にGROUP BYしたいとき

はじめまして。
SQLで部分的にGROUP BYで集計したいのですが、
どうもしっくりくるSQLがかけません。
多分CASEあたりを使うと綺麗で高速なSQLがかけると思っています。
皆様のお知恵をお借りしたく投稿しました。

具体的には以下のような出納帳データで

出納帳
日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -1000
2012/8/21 -2000
2012/8/22 3000
2012/8/23 4000
2012/8/24 -3000
2012/8/24 -4000
2012/8/27 5000

↓集計

日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -3000(-1000と-2000を集約)
2012/8/22 3000
2012/8/23 4000
2012/8/24 -7000(-3000と-4000を集約)
2012/8/27 5000

というように、マイナスの金額は集約してしまいたいのですが、どのようなSQLが最適でしょうか?
とりあえず、UNIONかなと思い、

(SELECT 日付, 金額
FROM 出納帳
WHERE 金額>=0
UNION ALL
SELECT 日付, 金額
FROM 出納帳
WHERE 金額<0
GROUP BY 日付 )
ORDER BY 日付

とプラス金額とマイナス金額にわけUNIONしたのですが、
もっと綺麗(高速)にやる方法があるのではないか?と思い投稿いたしました。
なにかヒントございましたら、ご教授ください。

DB環境:Oracle 11g

はじめまして。
SQLで部分的にGROUP BYで集計したいのですが、
どうもしっくりくるSQLがかけません。
多分CASEあたりを使うと綺麗で高速なSQLがかけると思っています。
皆様のお知恵をお借りしたく投稿しました。

具体的には以下のような出納帳データで

出納帳
日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -1000
2012/8/21 -2000
2012/8/22 3000
2012/8/23 4000
2012/8/24 -3000
2012/8/24 -4000
2012/8/27 5000

↓集計

日付     金額
2012/8/20 1000
2012/8/20 2000
2012/8/...続きを読む

Aベストアンサー

--綺麗かどうかはともかく、かなり無理やり
SELECT 日付, SUM(金額) AS 金額
FROM (
SELECT 日付, 金額,
ROW_NUMBER() OVER (PARTITION BY 日付 ORDER BY 金額) AS id
FROM 出納帳
)
GROUP BY 日付, CASE WHEN 金額 < 0 THEN 0 ELSE id END;

QUnionの結果全体をOrder By したい。

いつもお世話になっています。
下記のSQLの結果をWEEK_KB,TIME_KB,SPAN_CDでソートするには
どのようにしたら良いのでしょうか?

色々考えたのですが、どうしてもわかりませんでした。
よろしくお願いいたします。

SQLServerのバージョンは2000だったと思います。。。。



SELECT
'2',
A.WEEK_KB,
A.TIME_KB,
A.SPAN_CD,
A.JUGYO_CD,
B.JUGYO_MEI,
ADD_FLG , UPD_FLG , DEL_FLG
FROM table1_wk As A
INNER JOIN 授業マスタ As B
ON A.JUGYO_CD = B.JUGYO_CD
WHERE
ID='aaa'
UNION
SELECT
'1',
C.WEEK_KB,
C.TIME_KB,
C.SPAN_CD,
C.JUGYO_CD,
D.JUGYO_MEI,
'0','0','0'
FROM table1 As C
INNER JOIN 授業マスタ AS D
ON C.JUGYO_CD = D.JUGYO_CD
WHERE
C.JUGYO_CD
NOT IN
( SELECT JUGYO_CD
FROM table1_wk
WHERE
ID='aaa' )

いつもお世話になっています。
下記のSQLの結果をWEEK_KB,TIME_KB,SPAN_CDでソートするには
どのようにしたら良いのでしょうか?

色々考えたのですが、どうしてもわかりませんでした。
よろしくお願いいたします。

SQLServerのバージョンは2000だったと思います。。。。



SELECT
'2',
A.WEEK_KB,
A.TIME_KB,
A.SPAN_CD,
A.JUGYO_CD,
B.JUGYO_MEI,
ADD_FLG , UPD_FLG , DEL_FLG
FROM table1_wk As A
INNER JOIN 授業マスタ As B
ON A.JUGYO_CD = B.JUGYO_CD
WHERE
ID='aaa'
U...続きを読む

Aベストアンサー

このまま末尾に

Order by 2,3,4

ではダメでした?
2番目から4番目までの列でSORTする、と言うANSI共通の構文です。

ダメだったら、インラインビューで括ってしまう、というのは?

select inview.* from
(
ここに上記のSQLを書く
) inview
order by 2,3,4


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング