質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1029閲覧

SQLでgroupbyに前方一致条件を加えたい

tmp-user

総合スコア44

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2023/03/08 02:34

編集2023/03/08 05:14

※質問の仕方が悪かったのでリライトします

イメージ説明

画像のようなデータがあるのですが、
IDの前方4桁分が一致するデータをグループ化して
下記のようなデータを取得したいです。

イメージ説明

SQL

1SELECT count(id) FROM test GROUP BY id

にどういった句を追加すれば前方4桁が一致するデータでgroupby出来るのでしょう??
※数値はランダムで、とにかく前方4桁でグループ化したいです

回答頂いたものを参考にすると、

SQL

1LEFT(count(id),4)

などが必要なのかなと思ったのですが
idが数値型のためか上手く動きませんでした。。

DBはPostgreSQLです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2023/03/08 03:21

想定するRDBの種類とバージョンを提示ください
tmp-user

2023/03/08 03:29

PostgreSqlです。
guest

回答2

0

SELECT count(id), (id % 10) as digit FROM test WHERE (id % 10) in (1, 2) GROUP BY (id % 10)

投稿2023/03/08 03:59

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp-user

2023/03/08 05:15

申し訳ないです。 質問のニュアンスが悪かったためリライトしました。
phper.k

2023/03/08 08:06

とりあえず実行はしてみたんかね?
guest

0

ベストアンサー

IDの桁数が不足している場合はゼロ埋めする場合

この場合は、IDが何桁であるのかを把握する必要があります。
LEFT(lpad(cast(ID as text), 6, '0'), 4)6 がIDの桁数です。
LEFT(lpad(cast(ID as text), 6, '0'), 4)4 は前方?桁でグループ化。の数値です。

SQL

1SELECT KEY, count(*) 2from 3 ( 4 SELECT LEFT(lpad(cast(ID as text), 6, '0'), 4) as KEY, ID 5 from test 6 ) data 7GROUP BY KEY;

IDの桁数が不足している場合でも先頭4桁で扱う場合

SQL

1SELECT KEY, count(*) 2from 3 ( 4 SELECT LEFT(cast(ID as text), 4) as KEY, ID 5 from test 6 ) data 7GROUP BY KEY;

上記2つの違い

88881 のような桁数が異なるIDがある場合・・・
前者(ゼロ埋めアリ)では、0888 としてカウントされます。
後者(ゼロ埋めなし)では、8888 としてカウントされます。

後者の場合は、888801 (6桁) 88881 (5桁) が同一視されることに注意が必要です。
ゼロ埋めを行わないので、どちらも先頭4桁は 8888 になってしまうので。前者ではこういうことは起こりません。
IDの桁数が必ず6桁と決まっている場合は後者のゼロ埋めなしの方が単純で良いでしょう。

DDL

SQL:DDL

1CREATE TABLE test( 2 3 ID int primary key 4 5); 6INSERT into test values (123456),(123411),(123468),(999112),(999134),(999153),(102499),(102489),(102485); 7 8INSERT into test values (88881),(88882),(88883);

投稿2023/03/08 03:20

編集2023/03/08 06:26
YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tmp-user

2023/03/08 03:32

ご回答ありがとうございます! 試してみます DBはPostgreSQLです。
YakumoSaki

2023/03/08 04:01

PostgreSQLでもLEFT、LPAD関数はあるようなのでそのまま動くと思います。 ご参考になれば幸いです。
tmp-user

2023/03/08 07:21

ありがとうございました。 お陰様で欲しかったデータが取得できました。 本当に感謝いたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問