「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2476
現在:5


異なるクエリーの結果を1つのクエリーにまとめたい

ページOpenOffice.org FAQの登録ページ
投稿者M.Kamataki
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2008-03-14 22:28:18 (金)
OSAll
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

Accessで呼ばれている結合(ユニオン)クエリはBaseでも使えるのでしょうか。

たとえば、以下のサンプルの成績表のデータベースで、組別性別の平均点を求めるクエリーと学年総合の平均点を求めるクエリーを1つのクエリーで実現するためにはどうしたらよいでしょうか。

file成績表2.odb


SQLの知識が必要ですが実現できます

M.Kamataki (2008-03-14 22:59:59 (金))

まず組別性別の平均点を求めるクエリーと学年総合の平均点を求めるクエリー、この2つを用意します。

下図が組別性別平均点クエリーです。

uq01.png

下図が学年別平均点クエリーです。

uq02.png

クエリーはデザインの画面で[デザインビューのオン/オフ切り換え]ボタンをクリックすると下図のようにSQL文を表示できます。

uq03.png

このようにSELECT命令で始まる文になっているのがわかります。SQLの演算子UNIONを用いると、2つ以上のSELECT命令で始まる文を1つのクエリーに結合することができます。上記で作成した2つのクエリーのSQL文を表示し、それぞれをコピーしておきましょう。そして、クエリーカテゴリの「SQL表示でクエリーを作成」をクリックして表示されたエディタで作成したのが、下図のSQL文です。赤枠で囲んだ[SQLコマンドを直接実行]もオンにしておきます(ユニオンクエリはこのボタンをオンにしておかないとエラーになります)。

uq04.png

1つめは組別性別平均点クエリーのSELECT文そのままです。UNION演算子の次の行から2つめのクエリーは、学年別平均点クエリーを変更しています。これはユニオンクエリでは、2つのSELECT文のフィールドの数をそろえなくてはいけないからです。また、それぞれのフィールドのデータ型が一致している必要もあります。学年別平均点クエリー側では、「学年」「組」「性別」のフィールドをそろえるため、次のSQLを追加しています。

NULL AS "学年", 99 AS "組", '学年平均' AS "性別",

また、並べ替えのため2つめのSELECT文の最後に次のSQLを追加しています。

ORDER BY "組", "性別"

通常では「学年」「組」「性別」のフィールドそれぞれ、値がないことを示す「NULL」値とその別名をASの右辺に書いておきます。しかし、「99」は並べ替えで学年平均の値がレコードの最後に表示されるように、また、「学年平均」はその右辺の数値のタイトルとして入力しています。

ORDERからのSQL文は「組」「性別」の各フィールドをキーに並べ替えを行います。なお、この並べ替えの命令は最後のSELECT文に指定する必要があります。

結果、この結合クエリーを実行すると下図のように組別性別の平均点の後に学年別の平均点が表示されるクエリーになります。

uq05.png

このユニオンクエリーは、レポートに集計欄を設けたいときにも利用できます。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を表示すると下図のようになります。

uq06.png

実は、このクエリーの表示にはトリックがあります。下図のようにsortフィールドは「列を表示しない」に設定してあるのです。

uq07.png

お名前:
題名:


添付ファイル: fileuq07.png 448件 [詳細] fileuq06.png 459件 [詳細] file成績表2.odb 1074件 [詳細] fileuq05.png 411件 [詳細] fileuq04.png 430件 [詳細] fileuq03.png 398件 [詳細] fileuq02.png 432件 [詳細] fileuq01.png 435件 [詳細]