Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


281 / 2272 ツリー ←次へ | 前へ→

【12281】特殊な並べ替え 13/2/15(金) 13:41 質問[未読]
【12282】Re:特殊な並べ替え 13/2/15(金) 16:06 発言[未読]
【12283】Re:特殊な並べ替え かるびの 13/2/17(日) 2:32 回答[未読]
【12286】Re:特殊な並べ替え 13/2/18(月) 19:14 お礼[未読]

【12281】特殊な並べ替え
質問    - 13/2/15(金) 13:41 -

引用なし
パスワード
   いつもお世話になります
よろしくお願いします

あるクエリがあり
SELECT 発注テーブル.日付, 発注テーブル.コード, 発注テーブル.ID, 発注テーブル.部署コード, 部署マスタ.部署
FROM 部署マスタ INNER JOIN 発注テーブル ON 部署マスタ.部署コード = 発注テーブル.部署コード
ORDER BY 発注テーブル.日付, 発注テーブル.コード;

展開すると
例)
日付    コード 部署
2011/4/1   1   総務
2011/4/2   2   経理
2011/4/3   4   企画
2011/4/7   3   庶務
      ・
      ・
      ・ 
2013/2/1   1   経理
2013/2/13  4   総務
2013/2/14  2   経理
2013/2/15  3   庶務
       
となります(部署コードは端折りました)

間違っているわけではないのですが、元データが必ずしも日付が若いとコードが若いとは限らないので、
これを

日付    コード 部署
2011/4/1   1   総務
2011/4/2   2   経理
2011/4/7   3   庶務
2011/4/3   4   企画
      ・
      ・
      ・ 
2013/2/1   1   経理
2013/2/14  2   経理
2013/2/15  3   庶務
2013/2/13  4   総務

のようにしたいです、どうすればよいでしょうか?

コードを先頭にすると、

コード  日付  部署  
1   2011/4/1  総務
1   2013/2/1  経理
2   2011/4/2  経理
2   2013/2/14 経理
3   2011/4/7  庶務
3   2013/2/15 庶務
4   2011/4/3  企画
4   2013/2/13 総務
      ・
      ・
      ・ 
となってしまうのでだめです
あくまでも年度ごとに順番に出るようにしたいです。
よろしくお願いします

【12282】Re:特殊な並べ替え
発言    - 13/2/15(金) 16:06 -

引用なし
パスワード
   あれから急に思いついて一応自己解決したのですが、あまりスマートじゃないような気がします。

SELECT Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000")) AS 日付コード, 発注テーブル.日付, 発注テーブル.コード, 発注テーブル.部署コード, 部署マスタ.部署
FROM 部署マスタ INNER JOIN 発注テーブル ON 部署マスタ.部署コード = 発注テーブル.部署コード
ORDER BY Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000")), 発注テーブル.日付, 発注テーブル.コード;

もしよろしければもっとスマートな方法を教えていただけると嬉しいです。

※質問投げかけておいてから、突然思いつくのでよく自己レスになってしまいます。これもスマートじゃないですよね、本当に申し訳ないです。

【12283】Re:特殊な並べ替え
回答  かるびの  - 13/2/17(日) 2:32 -

引用なし
パスワード
   >Val(Year(DateSerial(Year([日付])+(Month([日付])<4),4,1)) & Format([コード],"0000"))

 よく思いつきましたねえ。
 でも、年度を求めるだけなら、
   Year([日付])+(Month([日付])<4)
だけでいいのではないですか。

 また、ORDER BY句も、
   ORDER BY Year([日付])+(Month([日付])<4)
       , コード
       , 日付
だけでいいように思うのですが。


 なお、年度を得る方法として、当該日付の3か月前の日の年を求めてあげる
という方法もあります。
 例えば、H25.03.31の3か月前はH24.12.31。この日の年はH24。
     H25.04.01の3か月前はH25.01.01。この日の年はH25。
 使う関数は、DateAdd関数とYear関数です。

【12286】Re:特殊な並べ替え
お礼    - 13/2/18(月) 19:14 -

引用なし
パスワード
   ▼かるびの さん:
いつもありがとうございます
教えていただいた通り直しました。

> また、ORDER BY句も、
>   ORDER BY Year([日付])+(Month([日付])<4)
>       , コード
>       , 日付
>だけでいいように思うのですが。

そうですね。以前使っていたの消すの忘れてました。

> なお、年度を得る方法として、当該日付の3か月前の日の年を求めてあげる
>という方法もあります。
> 例えば、H25.03.31の3か月前はH24.12.31。この日の年はH24。
>     H25.04.01の3か月前はH25.01.01。この日の年はH25。
> 使う関数は、DateAdd関数とYear関数です。

やってみます
ありがとうございました。

281 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free