質問編集履歴

3

誤字を修正しました

2020/05/08 03:01

投稿

sumAA
sumAA

スコア14

test CHANGED
File without changes
test CHANGED
@@ -238,7 +238,7 @@
238
238
 
239
239
  CONCAT(u.l_name, u.f_name),
240
240
 
241
- CONCAT(u.l_name_kana, u.f_name_kana) AS,
241
+ CONCAT(u.l_name_kana, u.f_name_kana) ,
242
242
 
243
243
  CONCAT(u.prefecture, u.city, u.o_address)
244
244
 
@@ -372,7 +372,7 @@
372
372
 
373
373
 
374
374
 
375
- なので、ゆくゆくデータ数が数万件レベルを想定し、サブクエリの利用は避ける方向性で、クエリ文を仕上げてみたいと考えておりますが、結合で理想のビューを出力するのに方向性が全くわきません。
375
+ ゆくゆくデータ数が数万件レベルを想定し、サブクエリの利用は避け、クエリ文を仕上げたいと考えておりますが、結合で理想のビューを出力するのに方向性が全くわきません。
376
376
 
377
377
 
378
378
 

2

説明の補足、試行結果を追記しました。

2020/05/08 03:01

投稿

sumAA
sumAA

スコア14

test CHANGED
File without changes
test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
   ・
134
134
 
135
- 全5人くらい
135
+ 全5人(絞り込んだ結果仮に5人とする)
136
136
 
137
137
  ```
138
138
 
@@ -164,7 +164,9 @@
164
164
 
165
165
  ーーーーーーー
166
166
 
167
- 14人 15人 (数字はざっくりです)
167
+ 14人 15人
168
+
169
+ (全レコード数は29件、IDがA始まりが14人、Bが15人とする)
168
170
 
169
171
  ```
170
172
 
@@ -174,40 +176,206 @@
174
176
 
175
177
  usrテーブルから [問題2]、[問題3]の情報を取り出せ。但し結果は一緒に表示しろ
176
178
 
177
- ```
178
-
179
179
  条件:サブクエリは使用しない・・実際環境はデータ数が数万件規模を想定
180
180
 
181
-
182
-
183
- 内容としては、レイアウトが一定でいため、NULLを活用し1つの表として出力するとのこと。
184
-
185
- なのですが、全くレイアウトの異なるテーブルをいかに1つの表にするのか、
186
-
187
- 方向性すらつかめない状況です。統合(UNION)は無理そうですし、
188
-
189
- 結合を活用するにしても結局、集計関数利用によるグルプ化の必要があるため
190
-
191
- 問題2の列数に集計が引っ張られてしまいます。
192
-
193
-
194
-
195
- ```
196
-
197
-
198
-
199
- 出力内容としては、
200
-
201
- 問題2、問題3で間違いないのは確認できているのですが、
202
-
203
- クエリ文を書き上げられずにいます。
204
-
205
-
206
-
207
- 何かお気付きの方がいらっしゃいましたら、
208
-
209
- ぜひ知恵をお借りできれば幸いです。
210
-
211
-
181
+ ↓↓
182
+
183
+ 答えとして欲しいの下のような出力結果で
184
+
185
+ ```OutPut
186
+
187
+ user_id 名前 名前カナ 住所 A人数 B人数
188
+
189
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
190
+
191
+ B0001 音無響子 オトナシキョウコ 岡山県・・・ 14 15
192
+
193
+  ・      ・・・     ・・・・     ・・・・    NULL NULL
194
+
195
+  ・ ・・・     ・・・・     ・・・・    NULL NULL
196
+
197
+ 全5人
198
+
199
+
200
+
201
+ ```
202
+
203
+
204
+
205
+ 現状思いつく限りで書いたクエリ文が、
206
+
207
+ ```
208
+
209
+ SELECT
210
+
211
+ u.user_id,
212
+
213
+ CONCAT(u.l_name, u.f_name) AS 名前,
214
+
215
+ CONCAT(u.l_name_kana, u.f_name_kana) AS 名前カナ,
216
+
217
+ CONCAT(u.prefecture, u.city, u.o_address) AS 住所,
218
+
219
+ SUM( CASE WHEN cont.user_id LIKE 'A%' THEN 1 ELSE 0 END ) AS A,
220
+
221
+ SUM( CASE WHEN cont.user_id LIKE 'B%' THEN 1 ELSE 0 END ) AS B
222
+
223
+ FROM
224
+
225
+ usr AS u INNER JOIN usr AS cont
226
+
227
+ ON
228
+
229
+ u.user_id = cont.user_id
230
+
231
+ WHERE
232
+
233
+ u.f_name_kana LIKE '%コ'
234
+
235
+ GROUP BY
236
+
237
+ u.user_id,
238
+
239
+ CONCAT(u.l_name, u.f_name),
240
+
241
+ CONCAT(u.l_name_kana, u.f_name_kana) AS,
242
+
243
+ CONCAT(u.prefecture, u.city, u.o_address)
244
+
245
+ ```
246
+
247
+ なのですが、この結果は、
248
+
249
+ ```
250
+
251
+ user_id 名前 名前カナ 住所 A人数 B人数
252
+
253
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
254
+
255
+ B0001 音無響子 オトナシキョウコ 岡山県・・・ 0 1
256
+
257
+  ・      ・・・     ・・・・     ・・・・     0 1
258
+
259
+  ・ ・・・     ・・・・     ・・・・     0 1
260
+
261
+ 全5人
262
+
263
+ ```
264
+
265
+ となってしまいます。
266
+
267
+
268
+
269
+ 集計関数SUMを使用しているのでGROUP BYは必須となります。
270
+
271
+ GROUP BYが必須となれば必然的に集計列以外をグループ化しないとなりません。
272
+
273
+ (今回だと、user_id, 名前, 名前カナ, 住所)
274
+
275
+ 自分で書いたクエリ文の結果が上記のようになるのは当然ではあるのですが、
276
+
277
+ 理想の出力結果を得るクエリ文を記載するにあたり
278
+
279
+ 方向性を見出せない状況になってしまっています。
280
+
281
+
282
+
283
+ UNIONでもできないか以下のように試してみました。
284
+
285
+ ```
286
+
287
+ SELECT
288
+
289
+ u.user_id,
290
+
291
+ CONCAT(u.l_name, u.f_name) AS 名前,
292
+
293
+ CONCAT(u.l_name_kana, u.f_name_kana) AS 名前カナ,
294
+
295
+ CONCAT(u.prefecture, u.city, u.o_address) AS 住所
296
+
297
+ FROM
298
+
299
+ usr AS u
300
+
301
+ WHERE
302
+
303
+ u.f_name_kana LIKE '%コ'
304
+
305
+ UNION
306
+
307
+ SELECT
308
+
309
+ SUM( CASE WHEN user_id LIKE 'A%' THEN 1 ELSE 0 END ) AS A
310
+
311
+ SUM( CASE WHEN user_id LIKE 'B%' THEN 1 ELSE 0 END ) AS B
312
+
313
+ FROM
314
+
315
+ usr
316
+
317
+
318
+
319
+ ```
320
+
321
+ 結果はエラー文が返ってきました。
322
+
323
+ 問題2と問題3とではテーブルの構造が異なるのでそうなるのは当然でしょう。
324
+
325
+
326
+
327
+ 以下サブクエリを利用すれば似たような次のような出力結果は得ることができました。
328
+
329
+ ```
330
+
331
+ SELECT
332
+
333
+ user_id,
334
+
335
+ CONCAT(l_name, f_name) AS 名前,
336
+
337
+ CONCAT(l_name_kana, f_name_kana) AS 名前カナ,
338
+
339
+ CONCAT(prefecture, city, o_address) AS 住所,
340
+
341
+ (SELECT DISTINCT COUNT(user_id) FROM usr WHERE user_id LIKE 'A%') AS A,
342
+
343
+ (SELECT DISTINCT COUNT(user_id) FROM usr WHERE user_id LIKE 'B%') AS B,
344
+
345
+ FROM
346
+
347
+ usr
348
+
349
+ WHERE
350
+
351
+ f_name_kana LIKE '%コ'
352
+
353
+ ```
354
+
355
+ ```output
356
+
357
+ user_id 名前 名前カナ 住所 A人数 B人数
358
+
359
+ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
360
+
361
+ B0001 音無響子 オトナシキョウコ 岡山県・・・ 14 15
362
+
363
+  ・     ・・・     ・・・・     ・・・・   14 15
364
+
365
+  ・ ・・・     ・・・・     ・・・・   14 15
366
+
367
+ 全5人
368
+
369
+ ```
370
+
371
+ A, B人数の集計結果が全行に入ってしまっているので、一行目だけに集計結果を表示できれば、と思っていましたが、サブクエリ文は便利な一方で処理数が増加傾向にあり重くなりがちです。
372
+
373
+
374
+
375
+ なので、ゆくゆくデータ数が数万件レベルを想定し、サブクエリの利用は避ける方向性で、クエリ文を仕上げてみたいと考えておりますが、結合で理想のビューを出力するのに方向性が全くわきません。
376
+
377
+
378
+
379
+ 何かご存知の方がいらっしゃればぜひともご教示いただけますと幸いです。
212
380
 
213
381
  よろしくお願いします。

1

こんばんは。問題2、問題3の間違いでした。ご指摘ありがとうございます!

2020/05/08 02:53

投稿

sumAA
sumAA

スコア14

test CHANGED
File without changes
test CHANGED
@@ -172,7 +172,7 @@
172
172
 
173
173
  **__問題4:__**
174
174
 
175
- usrテーブルから [問題2]、[問題4]の情報を取り出せ。但し結果は一緒に表示しろ
175
+ usrテーブルから [問題2]、[問題3]の情報を取り出せ。但し結果は一緒に表示しろ
176
176
 
177
177
  ```
178
178
 
@@ -198,7 +198,7 @@
198
198
 
199
199
  出力内容としては、
200
200
 
201
- 問題2、問題4で間違いないのは確認できているのですが、
201
+ 問題2、問題3で間違いないのは確認できているのですが、
202
202
 
203
203
  クエリ文を書き上げられずにいます。
204
204