さまざまな抽出のバリエーションを確認する
[3]で作成した「メール抽出.sql」のSELECT文を変更することで、テーブルからさまざまな条件でデータ抽出を行うことができます。
本文の長さで抽出
SELECTの後には、個別の列名だけでなく、式を指定することもできます。以下は、本文の長さが200より大きいものだけの本文の長さと本文を取り出すSELECT文です。SELECTで指定した結果の列にはasで名前を付与できます。
SELECT len(BodyText) as '本文の長さ',BodyText FROM MAIL_TABLE WHERE len(BodyText)>200
送信者による抽出
今回のサンプルの元データは同じアカウントでの送受信なので、送信者や宛先などがそのアカウントしかありませんが、他の複数アカウントから受信を行っているアカウントの受信メッセージを登録されているとすれば、SELECT文のWHERE句などで特定の送信者・受信者のメールのデータだけ抽出することもできます。たとえば、testという単語が送信者に含まれているメールを抽出するSELECT文は以下のようになります。
SELECT * FROM MAIL_TABLE WHERE FromUser like '%test%'
メールを新しい順に取得
ORDER BYでメールの並べ替えもできます。以下は、MAIL_TABLEのすべてのデータを、送信日時(Date)の降順(新しい順)で並べ替えた時の最初の3件のすべての列を取得するという意味になります。
SELECT TOP 3 * FROM MAIL_TABLE ORDER BY Date DESC
月ごとのメールを集計
GROUP BYでグループ化、集計なども可能です。以下は、送信日時(Date)の月ごとのメール数取得するSELECT文です。
SELECT MONTH(Date) as '月',count(*) as 'メール数' FROM MAIL_TABLE GROUP BY MONTH(Date)
集計後に条件で抽出
GROUP BYでグループ化してカウントした結果の列についての条件で抽出したい場合にはHAVINGを使用します。
以下は、曜日ごとにメール数をカウントして、その数が5より大きいものだけ曜日だけするSELECT文です。
SELECT DATENAME(weekday,Date) as '曜日',count(*) as 'メール数' FROM MAIL_TABLE GROUP BY DATENAME(weekday,Date) HAVING count(*) > 5
サブクエリ
1つのSELECT文の結果を別のSELECT文で使用する方法の1つとして、サブクエリがあります。
たとえば以下は、本文が長さが最大のメールを取得するSELECT文です。サブクエリ(太字)で求めた最大長をもとにメールを取得します。
SELECT * FROM MAIL_TABLE WHERE len(BodyText) = (SELECT max(len(BodyText)) FROM MAIL_TABLE)
複数テーブルの結合
複数のテーブルがあるデータベースでは、あるテーブルのデータの値が別のテーブルのデータに関連付いている場合があります。JOIN(結合)を利用することで、一度のSELECTで関連付いた複数のテーブルの値を取得できます。本稿のサンプルはテーブルは一つしかないので、以下ではシステムカタログビューを使用した例を紹介します。
SELECT C.column_id,C.name as column_name,TY.name as type_name,C.max_length,C.is_nullable FROM sys.all_columns C JOIN sys.types TY on TY.user_type_id = C.user_type_id where C.object_id=object_id('MAIL_TABLE')
sys.all_columnsはすべての列の情報を持っている、sys.typesはすべての型情報を持っている、それぞれビューです。JOIN onで列情報のuser_type_idの値をもとに、型情報のuser_type_idの値が一致するデータを参照して、そのname列を取得しています。この例であれば対象をMAIL_TABLEとしているので、MAIL_TABLEのテーブルの列定義情報を取得していることになります。
複数のテーブルから値を取得するSELECT文では、列の指定に[テーブル名.列名]の形で、参照先テーブル名を指定します。また、テーブルやビュー名の後ろに、SELECT文内で参照できる短い別名を指定することができます(この例であれば、C、TYがそれです)。
テーブル変数
結果をSQL Server内で一時的に変数に保存して、別のSELECT文で使用することができます。
以下では、曜日ごとのメール数集計結果の表を変数に保存して、送信日の曜日がメール数最大の曜日に一致するデータを抽出しています。
declare @countTable table([曜日] nvarchar(max),[メール数] int) INSERT INTO @countTable SELECT DATENAME(weekday,Date),count(*) FROM MAIL_TABLE GROUP BY DATENAME(weekday,Date) SELECT M.* FROM MAIL_TABLE M JOIN @countTable C ON C.曜日 = DATENAME(weekday,M.Date) WHERE [メール数] = (SELECT max([メール数]) FROM @countTable)
まとめ
前回と今回で、Power Automate for Desktopのフローから、DBMSに接続して、データを登録、データを取得するアクションを説明しました。
日々の業務フローや他のシステムでデータベースにデータを登録して、大量に蓄積されたデータを分析・活用するためにデータを抽出する場合に、今回紹介したアクションを使用してフローを作成するといった利用方法が考えられます。