いつもお世話になっております。
RfromL.comです。
今回はSQL serverにおいて、複数テーブルの件数をワンクエリーで一括カウントするSQLについてです。
CONTENTS
1.はじめに
1-1.使用する機能
1-2.実例で使用するテーブル・データ
1-3.検証環境
2.縦持ち件数表
2-1.SQL文
2-2.解説と実行結果
3.横持ち件数表
3-1.SQL文
3-2.解説と実行結果
4.おわりに
5.添付資料(各種SQL)
1.はじめに
今回は複数のテーブル件数をひとつのSQL文で取得する方法について記載します。
テーブルの件数を知りたい時は、以下のようにcount関数を使用することで件数を取得することができます。
[SQL文]
select count(*) from テーブル名;
上記SQL文を使った例として11件のデータがある「銘柄基本」というテーブルから件数を取得してみます。
[実例SQL文]
select count(*) from 銘柄基本;
[実行結果]
テーブル内のレコード数が11件あるので実行結果ペインに「11」が出力されます。
複数のテーブルから件数を知りたければ、テーブル数の分だけ同じようにcount関数のSQLを記述すればよいですが実行結果が別々のペインで出力されてしまいます。
例として「銘柄基本」「価格情報」「処理日テーブル」というテーブルから件数を取得してみます。
[実例SQL文]
select count(*) from 銘柄基本;
select count(*) from 価格情報;
select count(*) from 処理日テーブル;
[実行結果]
実行結果を見ると、結果の表が3つに分かれて出力されていることがわかります。
単純に件数が知りたいというだけであれば、これでもいいですがエビデンスや、情報として表に残したいとなるとこれだと扱いにくいです。
今回紹介する件数取得SQLは複数テーブルの件数を一つの表で出力する方法です。
出力の仕方は以下の2種類です。
①縦持ち件数表
②横持ち件数表
それぞれ、ワンクエリーで実行するので一つの表にまとまって件数の一覧を出力することができます。
1-1.使用する機能
今回紹介するSQL文は主に以下4つの機能を使用します。
No | 機能名 | 説明 |
1 | select文 | データを参照する命令文 |
2 | count関数 | データの件数を取得する関数 |
3 | as句 | カラム名やテーブル名に別名を定義する機能 |
4 | union all演算子 | 複数のSQL文で抽出した結果を統合する演算子 |
実際の使い方については、今回紹介するSQL文の「解説と実行」項で記載します。
1-2.実例で使用するテーブル・データ
今回紹介するSQL文を実行するにあたって用意したテーブル、及びデータについて記載しておきます。
[使用テーブル]
テーブルは以下の3テーブル用意します。
①「銘柄基本」
②「価格情報」
③「処理日テーブル」
[テーブル定義とデータ内容]
使用するテーブルそれぞれの定義とデータの内容は以下の通りです。
①「銘柄基本」
[テーブル定義]
No | 項目名 | 型 | 桁 | Null | KEY |
1 | 銘柄コード | char | 4 | NG | 1 |
2 | 銘柄名 | char | 60 | NG | |
3 | 銘柄区分 | char | 1 | NG | |
4 | 運用資産区分 | char | 2 | NG | |
5 | 基準年月日 | char | 8 | NG | 2 |
[データ内容]
銘柄コード | 銘柄名 | 銘柄区分 | 運用資産区分 | 基準年月日 |
2971 | エスコンジャパンリート投資法人 | 3 | 08 | 20220809 |
2971 | エスコンジャパンリート投資法人 8月12日 | 3 | 08 | 20220812 |
2972 | サンケイリアルエステート投資法人 | 3 | 01 | 20220809 |
2979 | SOSiLA物流リート投資法人 | 3 | 05 | 20220809 |
2989 | 東海道リート投資法人 | 3 | 07 | 20220809 |
3226 | 日本アコモデーションファンド投資法人 | 3 | 02 | 20220809 |
9281 | タカラレーベン・インフラ投資法人 | 4 | 00 | 20220809 |
9282 | いちごグリーンインフラ投資法人 | 4 | 00 | 20220809 |
9283 | 日本再生可能エネルギーインフラ投資法人 | 4 | 00 | 20220809 |
9284 | カナディアン・ソーラー・インフラ投資法人 | 4 | 00 | 20220809 |
9285 | 東京インフラ・エネルギー投資法人 | 4 | 00 | 20220809 |
②「価格情報」
[テーブル定義]
No | 項目名 | 型 | 桁 | Null | KEY |
1 | 銘柄コード | char | 4 | NG | 1 |
2 | 価格 | numeric | 18, 0 | NG | |
3 | 利回り | numeric | 09, 2 | NG | |
4 | 1口NAV | numeric | 12, 0 | NG | |
5 | NAV倍率 | numeric | 09, 2 | NG | |
6 | 時価総額 | numeric | 12, 0 | NG | |
7 | 出来高 | numeric | 12, 0 | NG | |
8 | 基準年月日 | char | 8 | NG | 2 |
[データ内容]
銘柄コード | 価格 | 利回り | 1口NAV | NAV倍率 | 時価総額 | 出来高 | 基準年月日 |
2971 | 118000 | 5.55 | 123495 | 0.96 | 41532 | 1051 | 20220808 |
2971 | 116700 | 5.61 | 123495 | 0.94 | 41075 | 1585 | 20220809 |
2972 | 99300 | 5.40 | 123268 | 0.81 | 46383 | 3344 | 20220808 |
2972 | 99200 | 5.40 | 123268 | 0.80 | 46336 | 1885 | 20220809 |
2979 | 154500 | 3.42 | 128871 | 1.20 | 105310 | 417 | 20220808 |
2979 | 154900 | 3.41 | 128871 | 1.20 | 105582 | 901 | 20220809 |
2979 | 153600 | 3.44 | 128871 | 1.19 | 104696 | 946 | 20220810 |
2989 | 124400 | 5.17 | 107724 | 1.15 | 21994 | 325 | 20220808 |
2989 | 123600 | 5.21 | 107724 | 1.15 | 21852 | 417 | 20220809 |
3226 | 684000 | 2.96 | 545645 | 1.25 | 344375 | 659 | 20220808 |
3226 | 679000 | 2.99 | 545645 | 1.24 | 341857 | 886 | 20220809 |
9281 | 110300 | 6.01 | 0 | 0.00 | 32909 | 239 | 20220808 |
9281 | 110300 | 6.01 | 0 | 0.00 | 32909 | 167 | 20220809 |
9282 | 69600 | 5.88 | 0 | 0.00 | 7166 | 17 | 20220808 |
9282 | 69400 | 5.90 | 0 | 0.00 | 7146 | 19 | 20220809 |
9283 | 114700 | 0.00 | 0 | 0.00 | 23009 | 67 | 20220808 |
9283 | 114700 | 0.00 | 0 | 0.00 | 23009 | 103 | 20220809 |
9284 | 122500 | 6.12 | 0 | 0.00 | 47365 | 86 | 20220808 |
9284 | 123200 | 6.09 | 0 | 0.00 | 47636 | 215 | 20220809 |
9285 | 93500 | 6.45 | 0 | 0.00 | 16457 | 194 | 20220808 |
9285 | 93400 | 6.46 | 0 | 0.00 | 16439 | 921 | 20220809 |
③「処理日テーブル」
[テーブル定義]
No | 項目名 | 型 | 桁 | Null | KEY |
1 | システムコード | char | 2 | NG | 1 |
2 | システム名称 | char | 30 | NG | |
3 | 処理日付 | char | 8 | NG |
[データ内容]
システムコード | システム名称 | 処理日付 |
LR | RFROMLシステム | 20220821 |
テーブル作成のクエリと、データのインサート文を今回の記事の最後に添付しておきますので、同様の状態で試してみたい人が”もし”居ればどうぞ。
1-3.検証環境
今回の使用した検証環境は以下のバージョンとなっています。
OS | Windows11 Home 64ビット |
DBMS | SQL Server 2019 |
統合環境 | SQL Server Management Studio v18.10 |
2.縦持ち件数表
複数テーブルの件数を縦持ちで出力するSQL文、解説と実行結果を記載します。
2-1.SQL文
縦持ち表で件数情報を取得するSQL文は以下の通りです。
select '銘柄基本' as テーブル, count(*) as 件数 from 銘柄基本 union all
select '価格情報' , count(*) from 価格情報 union all
select '処理日テーブル' , count(*) from 処理日テーブル;
内容の解説については次項にて行います。
2-2.解説と実行結果
縦持ち件数表出力のSQL文について、言葉で説明すると以下の処理を行っています。
①count関数でテーブルの件数を取得
②as句で出力結果に項目名「テーブル」「件数」を設定
③count結果項目の前に文字列リテラルで項目「テーブル名」を追加
④union allで各テーブルのcount結果を統合
①のcount関数については、「1.はじめに」で記載したのでここでは割愛しますが、②以降についてはそれぞれ設定しないとどうなるかを示しながら解説します。
「②」as句で項目名を設定していますが、設定しなかった場合は以下のように表がみづらくなるので設定しています。
「③」次に文字列リテラルでテーブル名の項目を追加しないと、以下のようにどのテーブルの件数かわかりづらいため設定しています。
「④」union allが各テーブルのcount結果を統合しているので、これがないと別表になってしまいます。
上記の①~④の処理をまとめることで、縦持ち件数表出力のSQL文になり、実際に実行すると以下のようになります。
これで、複数テーブルの件数が縦持ちの表で取得できます。
3.横持ち件数表
複数テーブルの件数を横持ちで出力するSQL文、解説と実行結果を記載します。
3-1.SQL文
横持ち表で件数情報を取得するSQL文は以下の通りです。
select
(select count(*) from 銘柄基本) as 銘柄基本,
(select count(*) from 価格情報) as 価格情報,
(select count(*) from 処理日テーブル) as 処理日テーブル;
内容の解説については次項にて行います。
3-2.解説と実行結果
横持ち件数表出力のSQL文について、言葉で説明すると以下の処理を行っています。
①count関数でテーブルの件数を取得
②先頭にselectを付与、各テーブルのcount部分を”()”(カッコ)で囲み、”,”(カンマ)で繋げる
③各テーブルの出力結果を項目名としてas句でテーブル名を設定
①のcount関数については、「1.はじめに」で記載したのでここでは割愛します。
②以降についてを、それぞれ以下に解説します。
「②」先頭にselectを付与、各テーブルのcount部分をカッコで囲み、カンマで繋げることで
「銘柄基本」のcount文でひとつのテーブル項目
「価格情報」のcount文でひとつのテーブル項目
「処理日テーブル」のcount文でひとつのテーブル項目
となるようにしています。
これが設定されていないと、個別のテーブル件数を出力するSQL文と同じになってしまいます。
「③」as句でテーブル名を設定しないと、以下のように表が見づらくなるので設定しています。
上記の①~③の処理をまとめることで、横持ち件数表出力のSQL文になり、実際に実行すると以下のようになります。
これで、複数テーブルの件数が横持ちの表で取得できます。
4.おわりに
今回は2種類のレイアウトで件数表を出力するSQLを紹介しましたが、僕が主に使用したのは縦持ち件数表の方をよく使いました。
よく使った場面としては、本番切り替えで件数ベースの確認結果をエビデンスとして残す際に資料として残す為に使っていました。
それ以外でも、本番稼働中の件数推移を調査するなどにも使用します。
まあ使いどころは人それぞれかなと思うのであくまで使用例ですね。
なお今回実行検証に使用したテーブルとデータについては、Create文とインサート文を以下に記載しておきますので、もし使うことがあればどうぞ。
以上です。
宜しくお願い致します。
5.添付資料(各種SQL)
■「銘柄基本」
[テーブル作成]
CREATE TABLE 銘柄基本 (
[銘柄コード] [char](4) NOT NULL,
[銘柄名] [char](60) NOT NULL,
[銘柄区分] [char](1) NOT NULL,
[運用資産区分] [char](2) NOT NULL,
[基準年月日] [char](8) NOT NULL,
PRIMARY KEY([銘柄コード],[基準年月日])
);
[データ投入]
insert into 銘柄基本 values ('2971','エスコンジャパンリート投資法人 ','3','08','20220809'),
('2971','エスコンジャパンリート投資法人 8月12日 ','3','08','20220812'),
('2972','サンケイリアルエステート投資法人 ','3','01','20220809'),
('2979','SOSiLA物流リート投資法人 ','3','05','20220809'),
('2989','東海道リート投資法人 ','3','07','20220809'),
('3226','日本アコモデーションファンド投資法人 ','3','02','20220809'),
('9281','タカラレーベン・インフラ投資法人 ','4','00','20220809'),
('9282','いちごグリーンインフラ投資法人 ','4','00','20220809'),
('9283','日本再生可能エネルギーインフラ投資法人 ','4','00','20220809'),
('9284','カナディアン・ソーラー・インフラ投資法人 ','4','00','20220809'),
('9285','東京インフラ・エネルギー投資法人 ','4','00','20220809');
■「価格情報」
[テーブル作成]
create table 価格情報 (
[銘柄コード] [char] (04) NOT NULL,
[価格] [numeric] (18, 0) NOT NULL,
[利回り] [numeric] (09, 2) NOT NULL,
[1口NAV] [numeric] (12, 0) NOT NULL,
[NAV倍率] [numeric] (09, 2) NOT NULL,
[時価総額] [numeric] (12, 0) NOT NULL,
[出来高] [numeric] (12, 0) NOT NULL,
[基準年月日] [char] (08) NOT NULL,
PRIMARY KEY([銘柄コード],[基準年月日])
);
[データ投入]
insert into 価格情報 values('2971',118000,5.55,123495,0.96,41532,1051,'20220808'),
('2971',116700,5.61,123495,0.94,41075,1585,'20220809'),
('2972',99300,5.40,123268,0.81,46383,3344,'20220808'),
('2972',99200,5.40,123268,0.80,46336,1885,'20220809'),
('2979',154500,3.42,128871,1.20,105310,417,'20220808'),
('2979',154900,3.41,128871,1.20,105582,901,'20220809'),
('2979',153600,3.44,128871,1.19,104696,946,'20220810'),
('2989',124400,5.17,107724,1.15,21994,325,'20220808'),
('2989',123600,5.21,107724,1.15,21852,417,'20220809'),
('3226',684000,2.96,545645,1.25,344375,659,'20220808'),
('3226',679000,2.99,545645,1.24,341857,886,'20220809'),
('9281',110300,6.01,0,0.00,32909,239,'20220808'),
('9281',110300,6.01,0,0.00,32909,167,'20220809'),
('9282',69600,5.88,0,0.00,7166,17,'20220808'),
('9282',69400,5.90,0,0.00,7146,19,'20220809'),
('9283',114700,0.00,0,0.00,23009,67,'20220808'),
('9283',114700,0.00,0,0.00,23009,103,'20220809'),
('9284',122500,6.12,0,0.00,47365,86,'20220808'),
('9284',123200,6.09,0,0.00,47636,215,'20220809'),
('9285',93500,6.45,0,0.00,16457,194,'20220808'),
('9285',93400,6.46,0,0.00,16439,921,'20220809');
■「処理日テーブル」
[テーブル作成]
CREATE TABLE 処理日テーブル (
[システムコード] [char](02) NOT NULL PRIMARY KEY,
[システム名称] [char](30) NOT NULL,
[処理日付] [char](08) NOT NULL
);
[データ投入]
insert into 処理日テーブル values ('LR','RFROMLシステム ','20220821');