SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Power Automate Desktopチュートリアル

Windows10の無償デスクトップ自動化ツール「Power Automate Desktop」でデータベースの操作を自動化する

Power Automate Desktopチュートリアル 第10回


  • X ポスト
  • このエントリーをはてなブックマークに追加

さまざまな抽出のバリエーションを確認する

 [3]で作成した「メール抽出.sql」のSELECT文を変更することで、テーブルからさまざまな条件でデータ抽出を行うことができます。

本文の長さで抽出

 SELECTの後には、個別の列名だけでなく、式を指定することもできます。以下は、本文の長さが200より大きいものだけの本文の長さと本文を取り出すSELECT文です。SELECTで指定した結果の列にはasで名前を付与できます。

[リスト2]メール抽出.sql
SELECT len(BodyText) as '本文の長さ',BodyText FROM MAIL_TABLE WHERE len(BodyText)>200

送信者による抽出

 今回のサンプルの元データは同じアカウントでの送受信なので、送信者や宛先などがそのアカウントしかありませんが、他の複数アカウントから受信を行っているアカウントの受信メッセージを登録されているとすれば、SELECT文のWHERE句などで特定の送信者・受信者のメールのデータだけ抽出することもできます。たとえば、testという単語が送信者に含まれているメールを抽出するSELECT文は以下のようになります。

[リスト3]メール抽出.sql
SELECT * FROM MAIL_TABLE WHERE FromUser like '%test%'

メールを新しい順に取得

 ORDER BYでメールの並べ替えもできます。以下は、MAIL_TABLEのすべてのデータを、送信日時(Date)の降順(新しい順)で並べ替えた時の最初の3件のすべての列を取得するという意味になります。

[リスト4]メール抽出.sql
SELECT TOP 3 * FROM MAIL_TABLE ORDER BY Date DESC

月ごとのメールを集計

 GROUP BYでグループ化、集計なども可能です。以下は、送信日時(Date)の月ごとのメール数取得するSELECT文です。

[リスト5]メール抽出.sql
SELECT MONTH(Date) as '月',count(*) as 'メール数' FROM MAIL_TABLE GROUP BY MONTH(Date)

集計後に条件で抽出

 GROUP BYでグループ化してカウントした結果の列についての条件で抽出したい場合にはHAVINGを使用します。

 以下は、曜日ごとにメール数をカウントして、その数が5より大きいものだけ曜日だけするSELECT文です。

[リスト6]メール抽出.sql
SELECT DATENAME(weekday,Date) as '曜日',count(*) as 'メール数' FROM MAIL_TABLE GROUP BY DATENAME(weekday,Date) HAVING count(*) > 5

サブクエリ

 1つのSELECT文の結果を別のSELECT文で使用する方法の1つとして、サブクエリがあります。

 たとえば以下は、本文が長さが最大のメールを取得するSELECT文です。サブクエリ(太字)で求めた最大長をもとにメールを取得します。

[リスト7]メール抽出.sql
SELECT * FROM MAIL_TABLE WHERE len(BodyText) = (SELECT max(len(BodyText)) FROM MAIL_TABLE)

複数テーブルの結合

 複数のテーブルがあるデータベースでは、あるテーブルのデータの値が別のテーブルのデータに関連付いている場合があります。JOIN(結合)を利用することで、一度のSELECTで関連付いた複数のテーブルの値を取得できます。本稿のサンプルはテーブルは一つしかないので、以下ではシステムカタログビューを使用した例を紹介します。

[リスト8]メール抽出.sql
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文で使用することができます。

 以下では、曜日ごとのメール数集計結果の表を変数に保存して、送信日の曜日がメール数最大の曜日に一致するデータを抽出しています。

[リスト9]メール抽出.sql
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に接続して、データを登録、データを取得するアクションを説明しました。

 日々の業務フローや他のシステムでデータベースにデータを登録して、大量に蓄積されたデータを分析・活用するためにデータを抽出する場合に、今回紹介したアクションを使用してフローを作成するといった利用方法が考えられます。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Power Automate Desktopチュートリアル連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 飯島 聡(WINGSプロジェクト イイジマ サトシ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16005 2023/02/20 11:56

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング