初めまして。
最近、SQLを学び始めました。
会社で掃除当番表を作成することになったのですが、どのようにしたらいいのかがわかりません。
条件としては、
1.人数は全部で31人。
2.1度にランダムに5人ずつ当番になる。
3.1度当番になると、全員の当番が一巡するまで回ってこない。
4.SQLServer2012を使用し、プログラミング後はAccessのフォームに出力してフォームで確認可能。
5.ランダムに選ばれた当番表を履歴テーブルに残す。
の5点になります。
本やネットで調べてみたのですがうまくいきません。
ご教授をお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんにちは。
イノ(inno)です。
方法はいろいろありますけど、
上記の条件のにあうSQLを作ってみました。
下記のSQLをそのまま実行してみてください。
先ずは、テーブルを作成してください。
--#################################
--#### テーブル作成
--#################################
--#### ユーザーテーブル
CREATE TABLE dbo.TempUser
(
Sn int
, UserName nvarchar(100)
, IsCheck bit
)
--#### 当番履歴テーブル
CREATE TABLE dbo.TempUserLog
(
Sn int
, UserName nvarchar(100)
, RegDate Datetime
)
ここまでがテーブル作成です。
それでは31人のユーザーデータを登録しましょう。
--#################################
--#### データ登録
--#################################
DECLARE @i int
SET @i = 1
WHILE(@i <= 31)
BEGIN
INSERT INTO dbo.TempUser (Sn, UserName, IsCheck)
VALUES (@i, CONVERT(varchar(10), @i) + 'さん', 0)
SET @i = @i + 1
END
ここまでがユーザー登録です。
では、下記のSQLを実行すると当番を計算して結果がでるようになっています。
履歴も残しています。
--#################################
--#### 当番計算
--#### 1度にランダムに5人ずつ当番になる。
--#### 1度当番になると、全員の当番が一巡するまで回ってこない。
--#################################
DECLARE @TempSelectUser TABLE
(
Sn int
,UserName nvarchar(100)
)
DECLARE @Sn int
DECLARE @UserName nvarchar(100)
DECLARE DB_Cursor CURSOR FOR
SELECT TOP 5 Sn, UserName
FROM
(
SELECT TOP 5 1 Code, Sn, UserName FROM dbo.TempUser WHERE IsCheck = 0 ORDER BY NEWID()
UNION ALL
SELECT TOP 5 2 Code, Sn, UserName FROM dbo.TempUser ORDER BY NEWID()
) A
ORDER BY Code
OPEN DB_Cursor
FETCH NEXT FROM DB_Cursor
INTO @Sn, @UserName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @TempSelectUser
SELECT @Sn, @UserName
IF 0 = (SELECT COUNT(Sn) FROM dbo.TempUser WHERE IsCheck = 0)
BEGIN
UPDATE dbo.TempUser
SET IsCheck = 0
END
UPDATE dbo.TempUser
SET IsCheck = 1
WHERE Sn = @Sn
INSERT INTO dbo.TempUserLog
SELECT @Sn, @UserName, GETDATE()
FETCH NEXT FROM DB_Cursor
INTO @Sn, @UserName
END
CLOSE DB_Cursor
DEALLOCATE DB_Cursor
--#################################
--#### 当番結果
--#################################
SELECT * FROM @TempSelectUser
ここまで実行してみてください。
上記のSQLを実行するたびに当番を計算して結果を表示します。
履歴を見るには下記のSQLを実行してご確認ください。
SELECT * FROM dbo.TempUserLog
ORDER BY RegDate DESC
どうですか。
正常に実行されましたか。
No.3
- 回答日時:
db2 connect to sample
db2 "drop table hoge"
db2 "CREATE TABLE hoge (id char(2), cnt int, date char(10))"
db2 "INSERT INTO hoge VALUES ('01',0,''),('02',0,''),('03',0,''),('04',0,''),('05',0,''),('06',0,''),('07',0,''),('08',0,''),('09',0,''),('10',0,''),('11',0,''),('12',0,''),('13',0,''),('14',0,''),('15',0,''),('16',0,''),('17',0,''),('18',0,''),('19',0,''),('20',0,''),('21',0,''),('22',0,''),('23',0,''),('24',0,''),('25',0,''),('26',0,''),('27',0,''),('28',0,''),('29',0,''),('30',0,''),('31',0,'')"
db2 "update hoge set cnt=cnt+1, date='%date:~0,10%' where id in (select id from (select id,int(RAND(100) * 65535) from hoge, SYSIBM.SYSDUMMY1 order by cnt, 2 limit 5))"
db2 "select * from hoge order by id"
DB2 で作ってみました。
結果はhogeテーブルに入っていますので、Accessなりでみてください。
No.2
- 回答日時:
さて、まず、当番の割り当ては、T-SQLを使うのですか?Accessでやってしまいますか?
(バッチ処理っぽくやるのか、画面を上げて当番を割り当てるのか?という聞き方と同じような話ですが)
どうやりたいのか書いてみてください。
どうできるのか?
と逆に聞かれるのなら、
Accessの画面を立ち上げてボタンを押すと何日分(?何か月分?)かの割り当てが自動で
行われる。
というのがいいのか、勝手に(というよりは自動的に)
割り当てを行ったものを参照するのがいいのか?
割り当てた後に変更はできないのか?
とか、要件がわからないとちょっと、回答に困ってしまうのが現実ですが。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで不可日と祝祭日の考慮してランダムに毎日の当番表を作成したいと思っています。 1 2023/07/12 21:14
- Excel(エクセル) 当番表の作成 2 2022/06/15 07:40
- Excel(エクセル) エクセルで当番表を作成したいです。 1 2023/08/09 19:53
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- SQL Server これをSQL文で出来るでしょうか? 1 2023/03/26 02:16
- Access(アクセス) Access DLookup vbaで条件を2件設定したい場合どうすればよいでですか? 現在 If( 1 2023/06/28 14:28
- 掃除機・クリーナー・空気清浄機 Excel活用法 1 2023/01/16 20:02
- Access(アクセス) Access VBAで条件を追加する(書き込む)場所 2 2022/03/23 12:05
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Excel(エクセル) EXCEL 指定した曜日に番号を振って、最大値までいったら1に戻る当番表 5 2022/07/20 16:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
[MySQL] UNIQUE制約の値を更新...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
selectした大量データをinsert...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
MySQLのint型で001と表示する方...
-
VIEWの元のテーブルのindexって...
-
複数テーブルのGROUP BY の使い...
-
Unionした最後にGROUP BYを追加...
-
Access パラメータクエリをcsv...
-
LAST_INSERT_IDで同時にアクセ...
-
PL/SQLの変数について
-
[SQLServer] テーブル名からカ...
-
VMwareがCDドライブを認識する...
-
1対多結合で多を絞り込み条件と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報