回答編集履歴
10
テキスト修正
answer
CHANGED
@@ -54,7 +54,7 @@
|
|
54
54
|
以下は動作確認のログです。
|
55
55
|
|
56
56
|
```
|
57
|
-
[ykt68@macbook15 ~]$ mysql -u root -p
|
57
|
+
[ykt68@macbook15 ~]$ mysql -u root -p teratail_db
|
58
58
|
Enter password:
|
59
59
|
Reading table information for completion of table and column names
|
60
60
|
You can turn off this feature to get a quicker startup with -A
|
9
テキスト修正
answer
CHANGED
@@ -28,10 +28,12 @@
|
|
28
28
|
```sql
|
29
29
|
FLOOR(DATEDIFF(NOW(), birth) / 365.25))
|
30
30
|
```
|
31
|
-
は、以下
|
31
|
+
は、stackoverflowの以下の投稿
|
32
|
+
|
32
33
|
[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)
|
33
|
-
の回答に出ていた
|
34
34
|
|
35
|
+
の回答に出ていた、シンプルなコード
|
36
|
+
|
35
37
|
```
|
36
38
|
I have used this query in our production code for nearly 10 years:
|
37
39
|
|
@@ -43,8 +45,10 @@
|
|
43
45
|
の算出方法を("in our production code for nearly 10 years"と言っているのを信じて)使いました。
|
44
46
|
ただし、この回答のコメントにあるように、少し不正確なところがあります。
|
45
47
|
|
46
|
-
また、年齢の区分によって GROUP BY するのは、
|
48
|
+
また、年齢の区分によって GROUP BY するのは、同じくstackoverflowの
|
49
|
+
|
47
50
|
[sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
|
51
|
+
|
48
52
|
を参考にしました。
|
49
53
|
|
50
54
|
以下は動作確認のログです。
|
8
テキスト修正
answer
CHANGED
@@ -3,22 +3,22 @@
|
|
3
3
|
|
4
4
|
```sql
|
5
5
|
SELECT
|
6
|
-
|
6
|
+
age_range AS '年齢区分' ,
|
7
|
-
|
7
|
+
COUNT(*) AS '人数'
|
8
8
|
FROM (
|
9
|
-
|
9
|
+
SELECT
|
10
|
-
|
10
|
+
name, birth,
|
11
|
-
|
11
|
+
(@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
|
12
|
-
|
12
|
+
(
|
13
|
-
|
13
|
+
CASE
|
14
|
-
|
14
|
+
WHEN @age < 18 THEN '18歳未満'
|
15
|
-
|
15
|
+
WHEN @age < 35 THEN '18歳以上 34歳以下'
|
16
|
-
|
16
|
+
WHEN @age < 45 THEN '35歳以上 44歳以下'
|
17
|
-
|
17
|
+
WHEN @age < 55 THEN '45歳以上 54歳以下'
|
18
|
-
|
18
|
+
WHEN @age < 65 THEN '55歳以上 64歳以下'
|
19
|
-
|
19
|
+
ELSE '65歳以上'
|
20
|
-
|
20
|
+
END ) AS age_range
|
21
|
-
|
21
|
+
FROM q113552
|
22
22
|
) table_with_age_range
|
23
23
|
GROUP BY age_range
|
24
24
|
ORDER BY age_range;
|
@@ -84,22 +84,22 @@
|
|
84
84
|
9 rows in set (0.00 sec)
|
85
85
|
|
86
86
|
mysql> SELECT
|
87
|
-
->
|
87
|
+
-> age_range AS '年齢区分' ,
|
88
|
-
->
|
88
|
+
-> COUNT(*) AS '人数'
|
89
89
|
-> FROM (
|
90
|
-
->
|
90
|
+
-> SELECT
|
91
|
-
->
|
91
|
+
-> name, birth,
|
92
|
-
->
|
92
|
+
-> (@age:=FLOOR(DATEDIFF(NOW(), birth) / 365.25)) AS age,
|
93
|
-
->
|
93
|
+
-> (
|
94
|
-
->
|
94
|
+
-> CASE
|
95
|
-
->
|
95
|
+
-> WHEN @age < 18 THEN '18歳未満'
|
96
|
-
->
|
96
|
+
-> WHEN @age < 35 THEN '18歳以上 34歳以下'
|
97
|
-
->
|
97
|
+
-> WHEN @age < 45 THEN '35歳以上 44歳以下'
|
98
|
-
->
|
98
|
+
-> WHEN @age < 55 THEN '45歳以上 54歳以下'
|
99
|
-
->
|
99
|
+
-> WHEN @age < 65 THEN '55歳以上 64歳以下'
|
100
|
-
->
|
100
|
+
-> ELSE '65歳以上'
|
101
|
-
->
|
101
|
+
-> END ) AS age_range
|
102
|
-
->
|
102
|
+
-> FROM q113552
|
103
103
|
-> ) table_with_age_range
|
104
104
|
-> GROUP BY age_range
|
105
105
|
-> ORDER BY age_range;
|
@@ -110,11 +110,11 @@
|
|
110
110
|
| 35歳以上 44歳以下 | 2 |
|
111
111
|
| 45歳以上 54歳以下 | 1 |
|
112
112
|
| 55歳以上 64歳以下 | 2 |
|
113
|
-
| 65歳以上
|
113
|
+
| 65歳以上 | 1 |
|
114
114
|
+-------------------------+--------+
|
115
115
|
5 rows in set (0.00 sec)
|
116
116
|
|
117
|
-
mysql>
|
117
|
+
mysql>
|
118
118
|
|
119
119
|
```
|
120
120
|
|
7
テキスト修正
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
```sql
|
5
5
|
SELECT
|
6
|
-
|
6
|
+
age_range AS '年齢区分' ,
|
7
7
|
COUNT(*) AS '人数'
|
8
8
|
FROM (
|
9
9
|
SELECT
|
@@ -12,16 +12,16 @@
|
|
12
12
|
(
|
13
13
|
CASE
|
14
14
|
WHEN @age < 18 THEN '18歳未満'
|
15
|
-
WHEN @age
|
15
|
+
WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
|
16
|
-
WHEN @age
|
16
|
+
WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
|
17
|
-
WHEN @age
|
17
|
+
WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
|
18
|
-
WHEN @age
|
18
|
+
WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
|
19
|
-
|
19
|
+
ELSE '65歳以上'
|
20
|
-
END ) AS
|
20
|
+
END ) AS age_range
|
21
21
|
FROM q113552
|
22
|
-
)
|
22
|
+
) table_with_age_range
|
23
|
-
GROUP BY
|
23
|
+
GROUP BY age_range
|
24
|
-
ORDER BY
|
24
|
+
ORDER BY age_range;
|
25
25
|
```
|
26
26
|
|
27
27
|
年齢を算出する
|
@@ -84,7 +84,7 @@
|
|
84
84
|
9 rows in set (0.00 sec)
|
85
85
|
|
86
86
|
mysql> SELECT
|
87
|
-
->
|
87
|
+
-> age_range AS '年齢区分' ,
|
88
88
|
-> COUNT(*) AS '人数'
|
89
89
|
-> FROM (
|
90
90
|
-> SELECT
|
@@ -93,16 +93,16 @@
|
|
93
93
|
-> (
|
94
94
|
-> CASE
|
95
95
|
-> WHEN @age < 18 THEN '18歳未満'
|
96
|
-
-> WHEN @age
|
96
|
+
-> WHEN @age BETWEEN 18 AND 34 THEN '18歳以上 34歳以下'
|
97
|
-
-> WHEN @age
|
97
|
+
-> WHEN @age BETWEEN 35 AND 44 THEN '35歳以上 44歳以下'
|
98
|
-
-> WHEN @age
|
98
|
+
-> WHEN @age BETWEEN 45 AND 54 THEN '45歳以上 54歳以下'
|
99
|
-
-> WHEN @age
|
99
|
+
-> WHEN @age BETWEEN 55 AND 64 THEN '55歳以上 64歳以下'
|
100
|
-
->
|
100
|
+
-> ELSE '65歳以上'
|
101
|
-
-> END ) AS
|
101
|
+
-> END ) AS age_range
|
102
102
|
-> FROM q113552
|
103
|
-
-> )
|
103
|
+
-> ) table_with_age_range
|
104
|
-
-> GROUP BY
|
104
|
+
-> GROUP BY age_range
|
105
|
-
-> ORDER BY
|
105
|
+
-> ORDER BY age_range;
|
106
106
|
+-------------------------+--------+
|
107
107
|
| 年齢区分 | 人数 |
|
108
108
|
+-------------------------+--------+
|
6
テキスト修正
answer
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
J__ answered Oct 15 '09 at 13:07
|
41
41
|
```
|
42
42
|
|
43
|
-
を
|
43
|
+
の算出方法を("in our production code for nearly 10 years"と言っているのを信じて)使いました。
|
44
44
|
ただし、この回答のコメントにあるように、少し不正確なところがあります。
|
45
45
|
|
46
46
|
また、年齢の区分によって GROUP BY するのは、
|
5
テキスト修正
answer
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
MySQL 5.6 にて、以下のクエリで動作を確認しました。
|
2
|
+
(※テーブル名は、`q113552` としています。)
|
2
3
|
|
3
4
|
```sql
|
4
5
|
SELECT
|
@@ -46,7 +47,7 @@
|
|
46
47
|
[sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
|
47
48
|
を参考にしました。
|
48
49
|
|
49
|
-
以下は動作確認のログです。
|
50
|
+
以下は動作確認のログです。
|
50
51
|
|
51
52
|
```
|
52
53
|
[ykt68@macbook15 ~]$ mysql -u root -p
|
4
テキスト修正
answer
CHANGED
@@ -125,7 +125,7 @@
|
|
125
125
|
> 年齢計算のSQL
|
126
126
|
> (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age from table;
|
127
127
|
|
128
|
-
を、そのまま使うと以下のようにエラーになりました。
|
128
|
+
を、そのまま使うと以下のようにエラーになりました。質問者様のお使いの MySQL と、私の使っている MySQL とのバージョン違いの問題でしょうか?
|
129
129
|
|
130
130
|
```
|
131
131
|
mysql> SELECT name, birth, (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q113552;
|
3
テキスト修正
answer
CHANGED
@@ -31,14 +31,17 @@
|
|
31
31
|
[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)
|
32
32
|
の回答に出ていた
|
33
33
|
|
34
|
+
```
|
34
|
-
|
35
|
+
I have used this query in our production code for nearly 10 years:
|
35
|
-
>
|
36
|
-
> SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
|
37
|
-
>
|
38
|
-
> J__ answered Oct 15 '09 at 13:07
|
39
36
|
|
40
|
-
|
37
|
+
SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
|
41
38
|
|
39
|
+
J__ answered Oct 15 '09 at 13:07
|
40
|
+
```
|
41
|
+
|
42
|
+
を、( "in our production code for nearly 10 years" と言っているのを信じて )使いました。
|
43
|
+
ただし、この回答のコメントにあるように、少し不正確なところがあります。
|
44
|
+
|
42
45
|
また、年齢の区分によって GROUP BY するのは、
|
43
46
|
[sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
|
44
47
|
を参考にしました。
|
2
テキスト修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
以下の
|
1
|
+
MySQL 5.6 にて、以下のクエリで動作を確認しました。
|
2
2
|
|
3
3
|
```sql
|
4
4
|
SELECT
|
1
テキスト修正
answer
CHANGED
@@ -43,7 +43,8 @@
|
|
43
43
|
[sql-group-by-age-range](https://stackoverflow.com/questions/8762886/sql-group-by-age-range)
|
44
44
|
を参考にしました。
|
45
45
|
|
46
|
-
以下は動作確認のログです。
|
46
|
+
以下は動作確認のログです。(※テーブル名は、`q113552` としています。)
|
47
|
+
|
47
48
|
```
|
48
49
|
[ykt68@macbook15 ~]$ mysql -u root -p
|
49
50
|
Enter password:
|
@@ -111,4 +112,19 @@
|
|
111
112
|
|
112
113
|
mysql>
|
113
114
|
|
115
|
+
```
|
116
|
+
|
117
|
+
---
|
118
|
+
**補足**
|
119
|
+
|
120
|
+
ご質問に挙がっていた、
|
121
|
+
|
122
|
+
> 年齢計算のSQL
|
123
|
+
> (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age from table;
|
124
|
+
|
125
|
+
を、そのまま使うと以下のようにエラーになりました。
|
126
|
+
|
127
|
+
```
|
128
|
+
mysql> SELECT name, birth, (YEAR(create()) - YEAR(birth)) - (RIGHT(create(), 5) < RIGHT(birth, 5)) AS age FROM q113552;
|
129
|
+
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
|
114
130
|
```
|