【SQL Server】複数テーブルの件数を一括カウントするSQL

いつもお世話になっております。
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機能名説明
1select文データを参照する命令文
2count関数データの件数を取得する関数
3as句カラム名やテーブル名に別名を定義する機能
4union all演算子複数のSQL文で抽出した結果を統合する演算子

実際の使い方については、今回紹介するSQL文の「解説と実行」項で記載します。


1-2.実例で使用するテーブル・データ

今回紹介するSQL文を実行するにあたって用意したテーブル、及びデータについて記載しておきます。


[使用テーブル]
テーブルは以下の3テーブル用意します。

①「銘柄基本」
②「価格情報」
③「処理日テーブル」



[テーブル定義とデータ内容]
使用するテーブルそれぞれの定義とデータの内容は以下の通りです。

①「銘柄基本」
[テーブル定義]

No項目名NullKEY
1銘柄コードchar4NG1
2銘柄名char60NG
3銘柄区分char1NG
4運用資産区分char2NG
5基準年月日char8NG2



[データ内容]

銘柄コード銘柄名銘柄区分運用資産区分基準年月日
2971エスコンジャパンリート投資法人               30820220809
2971エスコンジャパンリート投資法人 8月12日         30820220812
2972サンケイリアルエステート投資法人              30120220809
2979SOSiLA物流リート投資法人               30520220809
2989東海道リート投資法人                    30720220809
3226日本アコモデーションファンド投資法人            30220220809
9281タカラレーベン・インフラ投資法人              40020220809
9282いちごグリーンインフラ投資法人               40020220809
9283日本再生可能エネルギーインフラ投資法人           40020220809
9284カナディアン・ソーラー・インフラ投資法人          40020220809
9285東京インフラ・エネルギー投資法人              40020220809




②「価格情報」
[テーブル定義]

No項目名NullKEY
1銘柄コードchar4NG1
2価格numeric18, 0NG
3利回りnumeric09, 2NG
41口NAVnumeric12, 0NG
5NAV倍率numeric09, 2NG
6時価総額numeric12, 0NG
7出来高numeric12, 0NG
8基準年月日char8NG2



[データ内容]

銘柄コード価格利回り1口NAVNAV倍率時価総額出来高基準年月日
29711180005.551234950.9641532105120220808
29711167005.611234950.9441075158520220809
2972993005.401232680.8146383334420220808
2972992005.401232680.8046336188520220809
29791545003.42128871 1.2010531041720220808
29791549003.41128871 1.2010558290120220809
29791536003.44128871 1.1910469694620220810
29891244005.17107724 1.152199432520220808
29891236005.21107724 1.152185241720220809
32266840002.96545645 1.2534437565920220808
32266790002.995456451.2434185788620220809
92811103006.0100.003290923920220808
92811103006.0100.003290916720220809
9282696005.8800.0071661720220808
9282694005.9000.0071461920220809
92831147000.0000.00230096720220808
92831147000.0000.002300910320220809
92841225006.1200.00473658620220808
92841232006.0900.004763621520220809
9285935006.4500.001645719420220808
9285934006.4600.001643992120220809




③「処理日テーブル」
[テーブル定義]

No項目名NullKEY
1システムコードchar2NG1
2システム名称char30NG
3処理日付char8NG



[データ内容]

システムコードシステム名称処理日付
LRRFROMLシステム     20220821

テーブル作成のクエリと、データのインサート文を今回の記事の最後に添付しておきますので、同様の状態で試してみたい人が”もし”居ればどうぞ。


1-3.検証環境

今回の使用した検証環境は以下のバージョンとなっています。

OSWindows11 Home 64ビット
DBMSSQL 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');