質問するログイン新規登録

質問編集履歴

3

文法の修正

2018/09/22 01:07

投稿

locoJr.
locoJr.

スコア24

title CHANGED
File without changes
body CHANGED
@@ -186,7 +186,7 @@
186
186
  MAX(tmp2.チームID) AS チームID
187
187
  ,CASE
188
188
  WHEN MAX(t.日時) IS NULL THEN
189
- CONVERT(datetime, CONVERT(char(8), MAX(tmp2.日時), 112) + '06:00:00')
189
+ CONVERT(datetime, CONVERT(char(8), MAX(tmp2.日時), 112) + '06:00:00') --6時の情報は、別テーブルに定義した値をSELECTします。
190
190
  ELSE
191
191
  MAX(t.日時)
192
192
  END AS 開始日時

2

書式の改善

2018/09/22 01:07

投稿

locoJr.
locoJr.

スコア24

title CHANGED
File without changes
body CHANGED
@@ -20,19 +20,19 @@
20
20
  ※チーム名がない点は、気にしないでください。
21
21
 
22
22
  ### 検討内容
23
+ 上記テーブルのデータはViewで以下の形式で持つことで、楽に問合せができると考えています。
24
+ ※タスク登録時には、既存の機能で他にも多くのテーブルにデータを追加しているため、実データで持つのは避けられたら・・・と思っています。
25
+ ![イメージ説明](333663d3d2e755ca781ac0b53fa72ee3.png)
26
+
23
- クライアントアプリからは、以下を引数としたストアドファンクションを実行します。
27
+ 問い合わせの方法ですが、クライアントアプリから以下を引数としたストアドファンクションを実行します。
24
28
  - 作業ID
25
29
  - 作業時間
26
30
  - 作業開始可能日時
27
31
 
28
32
  ストアドファンクションでは、上記テーブルのデータより以下の結果を返します。
29
33
  - 開始可能日時
34
+  ※開始日時が一番早い1件のみ。(TOP 1かつORDER BY 開始日時 DESC)
30
35
 
31
- 上記テーブルのデータはViewで以下の形式で持つことで、楽に問合せができると考えています。
32
- チームの時間帯毎の残リソース及び作業時間があれば、可能と考えました。
33
- タスク登録時には、既存の機能で他にも多くのテーブルにデータを追加しているため、実データで持つのは避けられたら・・・と思っています。
34
- ![イメージ説明](333663d3d2e755ca781ac0b53fa72ee3.png)
35
-
36
36
  実データのイメージは、以下になります。
37
37
  ![イメージ説明](4c6c5f0cc96dbbef811d5c7cefffe1f8.png)
38
38
 
@@ -40,39 +40,173 @@
40
40
  なお、引数で作業開始可能日時を渡すため、残リソースViewの開始日時が作業開始可能日時を超えている場合、
41
41
  作業時間も作業開始可能日時~終了日時の分で算出し、返す開始日時は作業開始可能日時とする必要があります。
42
42
 
43
+ ### ソース
44
+ 2018/09/22:追記しました。
45
+ - チームマスタ
46
+ ```lang-SQL
47
+ CREATE TABLE TeamMaster
48
+ (
49
+ チームID varchar(10) NOT NULL,
50
+ 所有リソース decimal(5,2) NOT NULL
51
+ )
52
+ ON PRIMARY
53
+ ALTER TABLE TeamMaster ADD CONSTRAINT PK_TeamMaster
54
+ PRIMARY KEY (チームID)
55
+ ON PRIMARY
56
+
57
+ INSERT INTO TeamMaster (チームID, 所有リソース) VALUES ('A', 5)
58
+ ```
59
+
60
+ - 作業マスタ
61
+ ```lang-SQL
62
+ CREATE TABLE WorkMaster
63
+ (
64
+ 作業ID varchar(10) NOT NULL,
65
+ 作業名 varchar(20) NOT NULL,
66
+ 必要リソース decimal(4,2) NOT NULL
67
+ )
68
+ ON PRIMARY
69
+ ALTER TABLE WorkMaster ADD CONSTRAINT PK_WorkMaster
70
+ PRIMARY KEY (作業ID)
71
+ ON PRIMARY
72
+
73
+ INSERT INTO WorkMaster (作業ID, 作業名, 必要リソース) VALUES ('W1', 'Work1', 2)
74
+ INSERT INTO WorkMaster (作業ID, 作業名, 必要リソース) VALUES ('W2', 'Work2', 2)
75
+ ```
76
+
77
+ - チーム⇔作業紐付けマスタ
78
+ ```lang-SQL
79
+ CREATE TABLE Team_WorkMaster
80
+ (
81
+ チームID varchar(10) NOT NULL,
82
+ 作業ID varchar(10) NOT NULL
83
+ )
84
+ ON PRIMARY
85
+ ALTER TABLE Team_WorkMaster ADD CONSTRAINT PK_Team_WorkMaster
86
+ PRIMARY KEY (チームID, 作業ID)
87
+ ON PRIMARY
88
+
89
+ INSERT INTO Team_WorkMaster (チームID, 作業ID) VALUES ('A', 'W1')
90
+ INSERT INTO Team_WorkMaster (チームID, 作業ID) VALUES ('A', 'W2')
91
+ ```
92
+
93
+ - 計画済タスクトランザクション
94
+ ```lang-SQL
95
+ CREATE TABLE PlanedTaskTran
96
+ (
97
+ タスクID decimal(10,0) NOT NULL, --実際には自動採番を設定している
98
+ 作業ID varchar(10) NOT NULL,
99
+ 開始日時 datetime NOT NULL,
100
+ 終了日時 datetime NOT NULL
101
+ )
102
+ ON PRIMARY
103
+ ALTER TABLE PlanedTaskTran ADD CONSTRAINT PK_PlanedTaskTran
104
+ PRIMARY KEY (タスクID)
105
+ ON PRIMARY
106
+
107
+ INSERT INTO PlanedTaskTran (タスクID, 作業ID, 開始日時, 終了日時) VALUES (1, 'W1', '2018/09/21 10:00:00', '2018/09/21 15:00:00')
108
+ INSERT INTO PlanedTaskTran (タスクID, 作業ID, 開始日時, 終了日時) VALUES (2, 'W2', '2018/09/21 11:00:00', '2018/09/21 14:00:00')
109
+ ```
110
+
111
+
43
112
  ### 試したこと
44
- Viewの多段使用で近いところまではいったのですが、実際のソースは会社にありメモできていませんが、おおまかに以下のような流れで考えました。
113
+ ~~Viewの多段使用で近いところまではいったのですが、実際のソースは会社にありメモできていませんが、おおまかに以下のような流れで考えました。~~
45
- ```
114
+ 2018/09/22:誤記等もありましたので、修正しました。
115
+
46
- --1.一旦、日時情報を1カラムにまとめる
116
+ - 一旦、日時情報を1カラムにまとめる
117
+ ```SQL
118
+ CREATE VIEW tmp1
119
+ (種別, チームID, 作業ID, 所有リソース, 必要リソース, 日時)
120
+ AS
47
121
  SELECT
48
122
  1 AS 種別
49
- ,T.チームID
123
+ ,Team_WorkMaster.チームID
124
+ ,PlanedTaskTran.作業ID
50
- ,T.所有リソース
125
+ ,TeamMaster.所有リソース
51
- ,W.必要リソース
126
+ ,WorkMaster.必要リソース
52
- ,P.開始日時 AS 日時
127
+ ,PlanedTaskTran.開始日時 AS 日時
53
- FROM 計画済タスクトランザクション AS P
128
+ FROM PlanedTaskTran
54
- JOIN チーム⇔作業紐付けマスタ AS TW ON TW.作業ID = P.作業ID
129
+ JOIN Team_WorkMaster ON Team_WorkMaster.作業ID = PlanedTaskTran.作業ID
55
- JOIN 作業マスタ AS W ON W.作業ID = P.作業ID
130
+ JOIN WorkMaster ON WorkMaster.作業ID = PlanedTaskTran.作業ID
56
- JOIN チームマスタ AS T ON T.チームID = TW.チームID
131
+ JOIN TeamMaster ON TeamMaster.チームID = Team_WorkMaster.チームID
57
- UNION
132
+ UNION ALL --データは重複することはないため、UNION ALLに修正しました。
58
133
  SELECT
59
134
  -1
60
- ,T.チームID
135
+ ,Team_WorkMaster.チームID
136
+ ,PlanedTaskTran.作業ID
61
- ,T.所有リソース
137
+ ,TeamMaster.所有リソース
62
- ,W.必要リソース
138
+ ,WorkMaster.必要リソース
63
- ,P.終了日時
139
+ ,PlanedTaskTran.開始日時
64
- FROM 計画済タスクトランザクション AS P
140
+ FROM PlanedTaskTran
65
- JOIN チーム⇔作業紐付けマスタ AS TW ON TW.作業ID = P.作業ID
141
+ JOIN Team_WorkMaster ON Team_WorkMaster.作業ID = PlanedTaskTran.作業ID
66
- JOIN 作業マスタ AS W ON W.作業ID = P.作業ID
142
+ JOIN WorkMaster ON WorkMaster.作業ID = PlanedTaskTran.作業ID
67
- JOIN チームマスタ AS T ON T.チームID = TW.チームID
143
+ JOIN TeamMaster ON TeamMaster.チームID = Team_WorkMaster.チームID
144
+ ```
145
+ |種別|チームID|作業ID|所有リソース|必要リソース|日時
146
+ |:--|:--|:--|:--|:--|:--|
147
+ |1|A|W1|5|2|2018/09/21 10:00:00|
148
+ |1|A|W2|5|2|2018/09/21 11:00:00|
149
+ |-1|A|W2|5|2|2018/09/21 14:00:00|
150
+ |-1|A|W1|5|2|2018/09/21 15:00:00|
68
151
 
69
- --2.種別の情報から、・・・すみませn、忘れました。
70
152
 
153
+ - 日時毎の残リソースを算出する
154
+ ```lang-SQL
155
+ CREATE VIEW tmp2
156
+ (チームID, 日時, 残リソース)
157
+ AS
158
+ SELECT
159
+ tmp1.チームID
160
+ ,tmp1.日時
161
+ ,(SELECT
162
+ MAX(t.所有リソース) - (SUM(t.種別) * MAX(t.必要リソース))
163
+ FROM tmp1 AS t
164
+ WHERE t.日時 < tmp1.日時
71
- --3.2で作成した情報を1レコードずらしてJOIN(FROM 2 JOIN 2 AS 2V ON 2V.日時 < 2.日時)し、
165
+ OR (t.日時 = tmp1.日時 AND t.種別 <= tmp1.種別)) AS 残リソース
166
+ FROM tmp1
167
+ ```
168
+ |チームID|日時|残リソース|
169
+ |:--|:--|:--|
72
- -- 2V.日時を開始日時、2.日時を終了日時として情報を算出する。
170
+ |A|2018/09/21 10:00:00|3|
171
+ |A|2018/09/21 11:00:00|1|
172
+ |A|2018/09/21 14:00:00|3|
173
+ |A|2018/09/21 15:00:00|5|
73
174
 
175
+
176
+ - 時間帯毎の残リソースを算出する
177
+ ```lang-SQL
178
+ CREATE VIEW RemainResource
179
+ (チームID, 開始日時, 終了日時, 残リソース, 作業可能時間)
180
+ AS
181
+ SELECT
182
+ tmp3.*
74
- --4.3で作成した情報から、DATEDIFF(ss,開始日時,終了日時)作業時間を算出する。
183
+ ,DATEDIFF(ss,tmp3.開始日時,tmp3.終了日時) AS 作業可能時間
184
+ FROM
185
+ (SELECT
186
+ MAX(tmp2.チームID) AS チームID
187
+ ,CASE
188
+ WHEN MAX(t.日時) IS NULL THEN
189
+ CONVERT(datetime, CONVERT(char(8), MAX(tmp2.日時), 112) + '06:00:00')
190
+ ELSE
191
+ MAX(t.日時)
192
+ END AS 開始日時
193
+ ,MAX(tmp2.日時) AS 終了日時
194
+ ,MAX(tmp2.残リソース) AS 残リソース
195
+ FROM tmp2
196
+ LEFT OUTER JOIN tmp2 AS t
197
+ ON t.日時 < tmp2.日時
198
+ GROUP BY tmp2.日時) AS tmp3
75
199
  ```
200
+ |チームID|開始日時|終了日時|残リソース|作業可能時間|
201
+ |:--|:--|--:|--:|--:|
202
+ |A|2018/09/21 06:00:00|2018/09/21 10:00:00|5|14400|
203
+ |A|2018/09/21 10:00:00|2018/09/21 11:00:00|3|3600|
204
+ |A|2018/09/21 11:00:00|2018/09/21 14:00:00|1|10800|
205
+ |A|2018/09/21 14:00:00|2018/09/21 15:00:00|3|3600|
206
+
207
+
208
+ ※上記クエリでは、2018/09/21 15:00:00~2018/09/22 06:00:00までの残リソースが5という情報は出力できていません。
209
+
76
210
  かなり長々としたクエリになり、且つ計画済トランザクションのデータが多いとパフォーマンスにも影響を与えると思い、
77
211
  別の手段がないかと今回質問させていただきました次第です。
78
212
 

1

文法の修正

2018/09/22 01:04

投稿

locoJr.
locoJr.

スコア24

title CHANGED
@@ -1,1 +1,1 @@
1
- チームの時間帯毎の使用リソースを出力するViewを作成したい
1
+ 時間帯が重複していれば、数値が少なくなようなViewを作成したい
body CHANGED
File without changes