異なるクエリーの結果を1つのクエリーにまとめたい †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | M.Kamataki |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2008-03-14 22:28:18 (金) |
OS | All |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
Accessで呼ばれている結合(ユニオン)クエリはBaseでも使えるのでしょうか。
たとえば、以下のサンプルの成績表のデータベースで、組別性別の平均点を求めるクエリーと学年総合の平均点を求めるクエリーを1つのクエリーで実現するためにはどうしたらよいでしょうか。
SQLの知識が必要ですが実現できます †
M.Kamataki (2008-03-14 22:59:59 (金))
まず組別性別の平均点を求めるクエリーと学年総合の平均点を求めるクエリー、この2つを用意します。
下図が組別性別平均点クエリーです。
下図が学年別平均点クエリーです。
クエリーはデザインの画面で[デザインビューのオン/オフ切り換え]ボタンをクリックすると下図のようにSQL文を表示できます。
このようにSELECT命令で始まる文になっているのがわかります。SQLの演算子UNIONを用いると、2つ以上のSELECT命令で始まる文を1つのクエリーに結合することができます。上記で作成した2つのクエリーのSQL文を表示し、それぞれをコピーしておきましょう。そして、クエリーカテゴリの「SQL表示でクエリーを作成」をクリックして表示されたエディタで作成したのが、下図のSQL文です。赤枠で囲んだ[SQLコマンドを直接実行]もオンにしておきます(ユニオンクエリはこのボタンをオンにしておかないとエラーになります)。
1つめは組別性別平均点クエリーのSELECT文そのままです。UNION演算子の次の行から2つめのクエリーは、学年別平均点クエリーを変更しています。これはユニオンクエリでは、2つのSELECT文のフィールドの数をそろえなくてはいけないからです。また、それぞれのフィールドのデータ型が一致している必要もあります。学年別平均点クエリー側では、「学年」「組」「性別」のフィールドをそろえるため、次のSQLを追加しています。NULL AS "学年", 99 AS "組", '学年平均' AS "性別",また、並べ替えのため2つめのSELECT文の最後に次のSQLを追加しています。
ORDER BY "組", "性別"通常では「学年」「組」「性別」のフィールドそれぞれ、値がないことを示す「NULL」値とその別名をASの右辺に書いておきます。しかし、「99」は並べ替えで学年平均の値がレコードの最後に表示されるように、また、「学年平均」はその右辺の数値のタイトルとして入力しています。
ORDERからのSQL文は「組」「性別」の各フィールドをキーに並べ替えを行います。なお、この並べ替えの命令は最後のSELECT文に指定する必要があります。
結果、この結合クエリーを実行すると下図のように組別性別の平均点の後に学年別の平均点が表示されるクエリーになります。
このユニオンクエリーは、レポートに集計欄を設けたいときにも利用できます。Accessのようにレポートに自由に集計欄を設けることができないBaseでは、憶えておきたいテクニックになります。
他のユニオンクエリーの例として、年度別に同じ構造のテーブルを用意するデータベースもあげられます。基本的には、次のようなSQL文で複数年にわたるテーブルを簡単に結合することができます。SELECT * FROM "2006年度テーブル" UNION SELECT * FROM "2007年度テーブル" UNION SELECT * FROM "2008年度テーブル"
小計欄を設ける †
M.Kamataki (2008-03-17 16:24:17 (月))
UNIONクエリーの応用として、上記の結合クエリーに、組別の平均点欄を設けてみましょう。今度は、思い通りの順番にレコードが並ぶようにsortフィールドを設けています。SQLは以下のようになります。SELECT "学年", "組", "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 1 AS "sort" FROM "成績表" GROUP BY "学年", "組", "性別" HAVING ( ( "組" = 1 ) ) UNION SELECT "学年", "組", '組別平均' AS "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 2 AS "sort" FROM "成績表" GROUP BY "学年", "組" HAVING ( ( "組" = 1 ) ) UNION SELECT "学年", "組", "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 3 AS "sort" FROM "成績表" GROUP BY "学年", "組", "性別" HAVING ( ( "組" = 2 ) ) UNION SELECT "学年", "組", '組別平均' AS "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 4 AS "sort" FROM "成績表" GROUP BY "学年", "組" HAVING ( ( "組" = 2 ) ) UNION SELECT "学年", "組", "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 5 AS "sort" FROM "成績表" GROUP BY "学年", "組", "性別" HAVING ( ( "組" = 3 ) ) UNION SELECT "学年", "組", '組別平均' AS "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 6 AS "sort" FROM "成績表" GROUP BY "学年", "組" HAVING ( ( "組" = 3 ) ) UNION SELECT NULL AS "学年", NULL AS "組", '学年平均' AS "性別", AVG( "国語" ) AS "国語", AVG( "算数" ) AS "算数", AVG( "理科" ) AS "理科", AVG( "社会" ) AS "社会", 7 AS "sort" FROM "成績表" GROUP BY "学年" ORDER BY "sort", "組"作成した結合クエリー2を表示すると下図のようになります。
実は、このクエリーの表示にはトリックがあります。下図のようにsortフィールドは「列を表示しない」に設定してあるのです。