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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

3回答

607閲覧

路線ごとに物件数を集計したい

takumil

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

0クリップ

投稿2021/08/03 19:41

データベースを学習中で不動産物件数を集計するSQLがわかりません。
グループ化したりと試してみましたが、、、複数の路線がある場合、1つのSQLで集計できるのでしょうか?

路線データ

路線ID路線名
1路線A
2路線B
3路線C
4路線D

物件データ(3つまで路線IDが保存されています。)
|物件ID|物件名|路線1|路線2|路線3|
|:--|:--:|--:|
|1|物件A|1|2|3|
|2|物件B|1|2||
|3|物件C|2|||

を路線ごとに集計したい

路線ID路線名物件数
1路線A2
2路線B3
3路線C1
4路線D0

路線が一つだけだと集計も簡単にできたのですが、3つあると???です。

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

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

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

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

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

guest

回答3

0

相関副問合せでCOUNTします。

SQL

1select 路線ID, 路線名 2 , coalesce((select count(物件ID) from 物件 3 where 路線.路線ID in (路線1, 路線2, 路線3) 4 ), 0) as 物件数 5from 路線

結合しての集計なら

SQL

1select 路線ID, 路線名, count(物件ID) 2from 路線 left join 物件 3 on 路線.路線ID in (物件.路線1, 物件.路線2, 物件.路線3) 4group by 路線ID, 路線名

投稿2021/08/04 02:47

編集2021/08/04 04:08
sazi

総合スコア25206

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

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

takumil

2021/08/12 07:01

回答いただきありがとうございました。
guest

0

路線-物件テーブルを別に持つか、路線データをJSON型にするかで
管理が楽になると思います

投稿2021/08/04 00:17

yambejp

総合スコア115012

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

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

takumil

2021/08/12 07:01

回答いただきありがとうございました。
guest

0

ベストアンサー

こんな感じでしょうか。

テーブル定義

sql

1create table rosen ( 2 rosen_id int primary key, 3 rosen_name varchar(255) 4); 5 6create table bukken ( 7 bukken_id int primary key, 8 bukken_name varchar(255), 9 rosen1 int references rosen (id), 10 rosen2 int references rosen (id), 11 rosen3 int references rosen (id) 12); 13 14insert into rosen values (1, '路線A'); 15insert into rosen values (2, '路線B'); 16insert into rosen values (3, '路線C'); 17insert into rosen values (4, '路線D'); 18 19insert into bukken values (1, '物件A', 1, 2, 3); 20insert into bukken values (2, '物件B', 1, 2, null); 21insert into bukken values (3, '物件C', 2, null, null);

問い合わせ

sql

1select rosen_id, rosen_name, count(bukken_id) as bukken_count 2 from ( 3 select rosen_id, rosen_name, bukken_id 4 from rosen left outer join bukken on rosen_id = bukken.rosen1 5 union 6 select rosen_id, rosen_name, bukken_id 7 from rosen left outer join bukken on rosen_id = bukken.rosen2 8 union 9 select rosen_id, rosen_name, bukken_id 10 from rosen left outer join bukken on rosen_id = bukken.rosen3 11 ) t 12 group by rosen_id, rosen_name;

結果

+----------+------------+--------------+ | rosen_id | rosen_name | bukken_count | +----------+------------+--------------+ | 1 | 路線A | 2 | | 2 | 路線B | 3 | | 3 | 路線C | 1 | | 4 | 路線D | 0 | +----------+------------+--------------+

投稿2021/08/03 20:30

編集2021/08/03 20:31
hoshi-takanori

総合スコア7895

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

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

takumil

2021/08/12 07:01

回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問