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

回答編集履歴

3

追記

2017/11/25 02:49

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -34,4 +34,5 @@
34
34
  | A105 | 西沢| 35 | A101 | 佐藤 | 40 |
35
35
  | A105 | 西沢| 35 | A105 | 西沢 | 35 |
36
36
 
37
- 上記をaの項目でgroup by すると count(*)は2となる
37
+ 上記をaの項目でgroup by すると count(*)は2となる
38
+ ※group by するときは、group by の無い状態で確認すると分かり易いですよ。

2

追記

2017/11/25 02:49

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -6,12 +6,32 @@
6
6
  select で指定している ```a.nama,a.tosi```がgroup byで指定されていないからエラーなのです。
7
7
  誤植には見えないので、こんな基本的なところが間違っている市販本は在り得ません。
8
8
 
9
- 多分、以下のような記述ではないでしょうか
9
+ 多分、以下のような記述ではないでしょうか(joinは直積で表現)
10
10
  ```SQL
11
- select a.bang,a.nama,a.tosi,count(*) from tb1 as a join tb1 as b where a.tosi <= b.tosi group by a.bang,a.nama,a.tosi;
11
+ select a.bang,a.nama,a.tosi,count(*) from tb1 as a , tb1 as b where a.tosi <= b.tosi group by a.bang,a.nama,a.tosi;
12
12
  ```
13
13
  > tb1でtosiの大きいものからの順位をつけるのが目的です。
14
14
  西沢の例ですと、となるのでa.tosi <= b.tosiだとcountは4
15
15
 
16
16
  にはならないですね。
17
- 表示するのは```a.tosi```ですから、それ以上のというのは35と45の2件です。
17
+ 表示するのは```a.tosi```ですから、それ以上のというのは35と45の2件です。
18
+
19
+ コメントに対しての説明で追記
20
+ ---
21
+ (bang,nama)=(A105,西沢)の例で説明します。
22
+ where条件が無いとき
23
+ |a.bang | a.nama| a.tosi|b.bang | b.nama| b.tosi|
24
+ |:--|:--:|--:|:--|:--:|--:|
25
+ | A105 | 西沢| 35 | A101 | 佐藤 | 40 |
26
+ | A105 | 西沢| 35 | A102 | 高橋 | 28 |
27
+ | A105 | 西沢| 35 | A103 | 中川 | 20 |
28
+ | A105 | 西沢| 35 | A104 | 渡辺 | 23 |
29
+ | A105 | 西沢| 35 | A105 | 西沢 | 35 |
30
+
31
+ where条件 a.tosi <= b.tosi のとき
32
+ |a.bang | a.nama| a.tosi|b.bang | b.nama| b.tosi|
33
+ |:--|:--:|--:|:--|:--:|--:|
34
+ | A105 | 西沢| 35 | A101 | 佐藤 | 40 |
35
+ | A105 | 西沢| 35 | A105 | 西沢 | 35 |
36
+
37
+ 上記をaの項目でgroup by すると count(*)は2となる

1

訂正

2017/11/25 02:37

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  ```
3
3
  SELECTリストの式#1はGROUP BY句にはなく、GROUP BY句のカラムに機能的に依存しない非集約カラム db1.a.namaを含みます。 これはsql_mode = only_full_group_byと互換性がありません
4
4
  ```
5
- group by 句を指定したときには、select する項目はgroup byで指定されなければなりません。
5
+ group by 句を指定したには、select する項目はgroup byで指定されなければなりません。
6
6
  select で指定している ```a.nama,a.tosi```がgroup byで指定されていないからエラーなのです。
7
7
  誤植には見えないので、こんな基本的なところが間違っている市販本は在り得ません。
8
8
 
@@ -11,7 +11,7 @@
11
11
  select a.bang,a.nama,a.tosi,count(*) from tb1 as a join tb1 as b where a.tosi <= b.tosi group by a.bang,a.nama,a.tosi;
12
12
  ```
13
13
  > tb1でtosiの大きいものからの順位をつけるのが目的です。
14
- >西沢の例ですと、となるのでa.tosi <= b.tosiだとcountは4
14
+ 西沢の例ですと、となるのでa.tosi <= b.tosiだとcountは4
15
15
 
16
16
  にはならないですね。
17
17
  表示するのは```a.tosi```ですから、それ以上のというのは35と45の2件です。