回答編集履歴
1
質問変更に追従
test
CHANGED
@@ -1,15 +1,51 @@
|
|
1
|
+
## IDの桁数が不足している場合はゼロ埋めする場合
|
2
|
+
|
3
|
+
この場合は、IDが何桁であるのかを把握する必要があります。
|
4
|
+
`LEFT(lpad(cast(ID as text), 6, '0'), 4)` の `6` がIDの桁数です。
|
1
|
-
|
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(
|
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
|
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)
|
50
|
+
INSERT into test values (88881),(88882),(88883);
|
15
51
|
```
|