回答編集履歴

1

質問変更に追従

2023/03/08 06:26

投稿

YakumoSaki
YakumoSaki

スコア2027

test CHANGED
@@ -1,15 +1,51 @@
1
+ ## IDの桁数が不足している場合はゼロ埋めする場合
2
+
3
+ この場合は、IDが何桁であるのかを把握する必要があります。
4
+ `LEFT(lpad(cast(ID as text), 6, '0'), 4)` の `6` がIDの桁数です。
1
- 二桁ゼロ埋め(ID 1 => 01) して1文字目でGROUP BYすれば良いですが、どDBをお使いなのか書かれていないのMySQL場合記述します。
5
+ `LEFT(lpad(cast(ID as text), 6, '0'), 4)` `4` は前方?桁グループ化。数値です。
2
6
 
3
7
  ```SQL
8
+ SELECT KEY, count(*)
9
+ from
10
+ (
4
- SELECT LEFT(LPAD(ID, 2, '0'), 1) as HITOKETA, count(*)
11
+ SELECT LEFT(lpad(cast(ID as text), 6, '0'), 4) as KEY, ID
5
- from test
12
+ from test
13
+ ) data
6
- GROUP BY LEFT(LPAD(ID, 2, '0'), 1);
14
+ GROUP BY KEY;
7
15
  ```
16
+
17
+ ## IDの桁数が不足している場合でも先頭4桁で扱う場合
18
+
19
+ ```SQL
20
+ SELECT KEY, count(*)
21
+ from
22
+ (
23
+ SELECT LEFT(cast(ID as text), 4) as KEY, ID
24
+ from test
25
+ ) data
26
+ GROUP BY KEY;
27
+ ```
28
+
29
+ ## 上記2つの違い
30
+
31
+ 88881 のような桁数が異なるIDがある場合・・・
32
+ 前者(ゼロ埋めアリ)では、`0888` としてカウントされます。
33
+ 後者(ゼロ埋めなし)では、`8888` としてカウントされます。
34
+
35
+ 後者の場合は、`888801` (6桁) `88881` (5桁) が同一視されることに注意が必要です。
36
+ ゼロ埋めを行わないので、どちらも先頭4桁は `8888` になってしまうので。前者ではこういうことは起こりません。
37
+ IDの桁数が必ず6桁と決まっている場合は後者のゼロ埋めなしの方が単純で良いでしょう。
38
+
39
+
40
+ ## DDL
8
41
 
9
42
  ```SQL:DDL
10
43
  CREATE TABLE test(
44
+
11
45
  ID int primary key
46
+
12
47
  );
48
+ INSERT into test values (123456),(123411),(123468),(999112),(999134),(999153),(102499),(102489),(102485);
13
49
 
14
- INSERT into test values (1),(2),(3),(10),(11),(12),(13),(20),(21);
50
+ INSERT into test values (88881),(88882),(88883);
15
51
  ```