回答編集履歴

10

テキスト修正

2018/02/15 21:25

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -110,7 +110,7 @@
110
110
 
111
111
  ```
112
112
 
113
- [ykt68@macbook15 ~]$ mysql -u root -p
113
+ [ykt68@macbook15 ~]$ mysql -u root -p teratail_db
114
114
 
115
115
  Enter password:
116
116
 

9

テキスト修正

2018/02/15 21:24

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -58,11 +58,15 @@
58
58
 
59
59
  ```
60
60
 
61
- は、以下
61
+ は、stackoverflowの以下の投稿
62
+
63
+
62
64
 
63
65
  [how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate](https://stackoverflow.com/questions/1572110/how-to-calculate-age-in-years-based-on-date-of-birth-and-getdate)
64
66
 
67
+
68
+
65
- の回答に出ていた
69
+ の回答に出ていた、シンプルなコード
66
70
 
67
71
 
68
72
 
@@ -88,10 +92,14 @@
88
92
 
89
93
 
90
94
 
91
- また、年齢の区分によって GROUP BY するのは、
95
+ また、年齢の区分によって GROUP BY するのは、同じくstackoverflowの
96
+
97
+
92
98
 
93
99
  [sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
94
100
 
101
+
102
+
95
103
  を参考にしました。
96
104
 
97
105
 

8

テキスト修正

2018/02/15 21:12

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -8,37 +8,37 @@
8
8
 
9
9
  SELECT
10
10
 
11
- age_range AS '年齢区分' ,
11
+ age_range AS '年齢区分' ,
12
-
12
+
13
- COUNT(*) AS '人数'
13
+ COUNT(*) AS '人数'
14
14
 
15
15
  FROM (
16
16
 
17
- SELECT
17
+ SELECT
18
-
18
+
19
- name, birth,
19
+ name, birth,
20
-
20
+
21
- (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
21
+ (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
22
-
22
+
23
- (
23
+ (
24
-
24
+
25
- CASE
25
+ CASE
26
-
26
+
27
- WHEN @age < 18 THEN '18歳未満'
27
+ WHEN @age < 18 THEN '18歳未満'
28
-
28
+
29
- WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
29
+ WHEN @age < 35 THEN '18歳以上 34歳以下'
30
-
30
+
31
- WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
31
+ WHEN @age < 45 THEN '35歳以上 44歳以下'
32
-
32
+
33
- WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
33
+ WHEN @age < 55 THEN '45歳以上 54歳以下'
34
-
34
+
35
- WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
35
+ WHEN @age < 65 THEN '55歳以上 64歳以下'
36
-
36
+
37
- ELSE '65歳以上'
37
+ ELSE '65歳以上'
38
-
38
+
39
- END ) AS age_range
39
+ END ) AS age_range
40
-
40
+
41
- FROM q113552
41
+ FROM q113552
42
42
 
43
43
  ) table_with_age_range
44
44
 
@@ -170,37 +170,37 @@
170
170
 
171
171
  mysql> SELECT
172
172
 
173
- -> age_range AS '年齢区分' ,
173
+ -> age_range AS '年齢区分' ,
174
-
174
+
175
- -> COUNT(*) AS '人数'
175
+ -> COUNT(*) AS '人数'
176
176
 
177
177
  -> FROM (
178
178
 
179
- -> SELECT
179
+ -> SELECT
180
-
180
+
181
- -> name, birth,
181
+ -> name, birth,
182
-
182
+
183
- -> (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
183
+ -> (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
184
-
184
+
185
- -> (
185
+ -> (
186
-
186
+
187
- -> CASE
187
+ -> CASE
188
-
188
+
189
- -> WHEN @age < 18 THEN '18歳未満'
189
+ -> WHEN @age < 18 THEN '18歳未満'
190
-
190
+
191
- -> WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
191
+ -> WHEN @age < 35 THEN '18歳以上 34歳以下'
192
-
192
+
193
- -> WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
193
+ -> WHEN @age < 45 THEN '35歳以上 44歳以下'
194
-
194
+
195
- -> WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
195
+ -> WHEN @age < 55 THEN '45歳以上 54歳以下'
196
-
196
+
197
- -> WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
197
+ -> WHEN @age < 65 THEN '55歳以上 64歳以下'
198
-
198
+
199
- -> ELSE '65歳以上'
199
+ -> ELSE '65歳以上'
200
-
200
+
201
- -> END ) AS age_range
201
+ -> END ) AS age_range
202
-
202
+
203
- -> FROM q113552
203
+ -> FROM q113552
204
204
 
205
205
  -> ) table_with_age_range
206
206
 
@@ -222,7 +222,7 @@
222
222
 
223
223
  | 55歳以上 64歳以下 | 2 |
224
224
 
225
- | 65歳以上 | 1 |
225
+ | 65歳以上 | 1 |
226
226
 
227
227
  +-------------------------+--------+
228
228
 
@@ -230,7 +230,7 @@
230
230
 
231
231
 
232
232
 
233
- mysql>
233
+ mysql>
234
234
 
235
235
 
236
236
 

7

テキスト修正

2018/02/15 20:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  SELECT
10
10
 
11
- age_span AS '年齢区分' ,
11
+ age_range AS '年齢区分' ,
12
12
 
13
13
  COUNT(*) AS '人数'
14
14
 
@@ -26,25 +26,25 @@
26
26
 
27
27
  WHEN @age < 18 THEN '18歳未満'
28
28
 
29
- WHEN @age < 35 THEN '18歳以上 34歳以下'
29
+ WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
30
-
30
+
31
- WHEN @age < 45 THEN '35歳以上 44歳以下'
31
+ WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
32
-
32
+
33
- WHEN @age < 55 THEN '45歳以上 54歳以下'
33
+ WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
34
-
34
+
35
- WHEN @age < 65 THEN '55歳以上 64歳以下'
35
+ WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
36
-
36
+
37
- ELSE '65歳以上'
37
+ ELSE '65歳以上'
38
-
38
+
39
- END ) AS age_span
39
+ END ) AS age_range
40
40
 
41
41
  FROM q113552
42
42
 
43
- ) table_with_age_span
43
+ ) table_with_age_range
44
-
44
+
45
- GROUP BY age_span
45
+ GROUP BY age_range
46
-
46
+
47
- ORDER BY age_span;
47
+ ORDER BY age_range;
48
48
 
49
49
  ```
50
50
 
@@ -170,7 +170,7 @@
170
170
 
171
171
  mysql> SELECT
172
172
 
173
- -> age_span AS '年齢区分' ,
173
+ -> age_range AS '年齢区分' ,
174
174
 
175
175
  -> COUNT(*) AS '人数'
176
176
 
@@ -188,25 +188,25 @@
188
188
 
189
189
  -> WHEN @age < 18 THEN '18歳未満'
190
190
 
191
- -> WHEN @age < 35 THEN '18歳以上 34歳以下'
191
+ -> WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
192
-
192
+
193
- -> WHEN @age < 45 THEN '35歳以上 44歳以下'
193
+ -> WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
194
-
194
+
195
- -> WHEN @age < 55 THEN '45歳以上 54歳以下'
195
+ -> WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
196
-
196
+
197
- -> WHEN @age < 65 THEN '55歳以上 64歳以下'
197
+ -> WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
198
-
198
+
199
- -> ELSE '65歳以上'
199
+ -> ELSE '65歳以上'
200
-
200
+
201
- -> END ) AS age_span
201
+ -> END ) AS age_range
202
202
 
203
203
  -> FROM q113552
204
204
 
205
- -> ) table_with_age_span
205
+ -> ) table_with_age_range
206
-
206
+
207
- -> GROUP BY age_span
207
+ -> GROUP BY age_range
208
-
208
+
209
- -> ORDER BY age_span;
209
+ -> ORDER BY age_range;
210
210
 
211
211
  +-------------------------+--------+
212
212
 

6

テキスト修正

2018/02/14 22:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
 
84
84
 
85
- "in our production code for nearly 10 years" と言っているのを信じて )使いました。
85
+ の算出方法を("in our production code for nearly 10 years"と言っているのを信じて)使いました。
86
86
 
87
87
  ただし、この回答のコメントにあるように、少し不正確なところがあります。
88
88
 

5

テキスト修正

2018/02/14 22:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,5 +1,7 @@
1
1
  MySQL 5.6 にて、以下のクエリで動作を確認しました。
2
2
 
3
+ (※テーブル名は、`q113552` としています。)
4
+
3
5
 
4
6
 
5
7
  ```sql
@@ -94,7 +96,7 @@
94
96
 
95
97
 
96
98
 
97
- 以下は動作確認のログです。(※テーブル名は、`q113552` としています。)
99
+ 以下は動作確認のログです。
98
100
 
99
101
 
100
102
 

4

テキスト修正

2018/02/14 22:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -252,7 +252,7 @@
252
252
 
253
253
 
254
254
 
255
- を、そのまま使うと以下のようにエラーになりました。
255
+ を、そのまま使うと以下のようにエラーになりました。質問者様のお使いの MySQL と、私の使っている MySQL とのバージョン違いの問題でしょうか?
256
256
 
257
257
 
258
258
 

3

テキスト修正

2018/02/14 22:35

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -64,19 +64,25 @@
64
64
 
65
65
 
66
66
 
67
+ ```
68
+
67
- > I have used this query in our production code for nearly 10 years:
69
+ I have used this query in our production code for nearly 10 years:
68
-
69
- >
70
+
70
-
71
+
72
+
71
- > SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
73
+ SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
72
-
73
- >
74
+
74
-
75
+
76
+
75
- > J__ answered Oct 15 '09 at 13:07
77
+ J__ answered Oct 15 '09 at 13:07
78
+
76
-
79
+ ```
80
+
81
+
82
+
77
-
83
+ を、( "in our production code for nearly 10 years" と言っているのを信じて )使いました。
78
-
84
+
79
- を使いまし。ただし、この回答のコメントにあるように、少し不正確なところがあります。
85
+ ただし、この回答のコメントにあるように、少し不正確なところがあります。
80
86
 
81
87
 
82
88
 

2

テキスト修正

2018/02/14 22:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,4 +1,4 @@
1
- 以下のSQLやってみました。
1
+ MySQL 5.6 にて、以下のクエリ動作を確認しました。
2
2
 
3
3
 
4
4
 

1

テキスト修正

2018/02/14 22:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -88,7 +88,9 @@
88
88
 
89
89
 
90
90
 
91
- 以下は動作確認のログです。
91
+ 以下は動作確認のログです。(※テーブル名は、`q113552` としています。)
92
+
93
+
92
94
 
93
95
  ```
94
96
 
@@ -225,3 +227,33 @@
225
227
 
226
228
 
227
229
  ```
230
+
231
+
232
+
233
+ ---
234
+
235
+ **補足**
236
+
237
+
238
+
239
+ ご質問に挙がっていた、
240
+
241
+
242
+
243
+ > 年齢計算のSQL
244
+
245
+ > (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age from table;
246
+
247
+
248
+
249
+ を、そのまま使うと以下のようにエラーになりました。
250
+
251
+
252
+
253
+ ```
254
+
255
+ mysql> SELECT name, birth, (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q113552;
256
+
257
+ ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q1' at line 1
258
+
259
+ ```