電子書籍の厳選無料作品が豊富!

はじめまして。
Access初心者です。

研究で23区の建物の集計を行っており、区名、建物面積、土地面積、建物階数、ある属性の有無(0,1)のデータがあります。(約計180万行)
区名とある属性の有無をグループ化、建物面積、土地面積を合計、あとカウントで集計を取りたいのですが、階数(0~69階まで)の条件の設定で手こずっています。
抽出条件を用いて、それぞれ1条件ずつ集計することはできました。

低層(0-2),中層(3-5),中高層(6-9),高層(10-)と4段階に分けたいのですが、1つのクエリで表すことは可能でしょうか?
結果できる行としましては、23×2×4=184行になる予定です。

よろしくお願いいたします。

A 回答 (3件)

pirorin654です。


属性についてですが、
ある属性の有無(0,1)
とされていますが、提示したSQL文ではテーブルの
属性はYes/No型にしています。したがってSQL文の
中では、(-1, 0)となっています。その点の確認
をしておいてください。
    • good
    • 0

mhassyさんがお手本を示されているのでEndスレ


に追いレスになりますが、部分集合の合計、
すなわち4つのものを取り出して足しあわ
せば必要なものが求められるというごく
初歩的な考えです。もっとも24x2x4の2x4
が対象なので厳密には8つですね。

ネックになっている階層別にまずつくることはして
いないのですか。普通に考えれば建物階数の抽出
条件にBetween 0 And 2 とか入れてみるものですが。
それをすれば何かに気付くはずです。その考えで
進めると以下のようになっていきます。
土地面積、建物面積の合計はどのような基準で行うのか
わからないので、グループ化した状態で合計をします。
たとえば、低層ならば属性を考慮して、かつIDという
オートナンバーをいれて、テーブル名をtblDATAとして、

#########################################
SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計, tblDATA.属性,

"低層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 0 And 2))
GROUP BY tblDATA.区名, tblDATA.属性, "低層"
HAVING (((tblDATA.属性)=0));

#########################################

SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計, tblDATA.属性,

"低層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 0 And 2))
GROUP BY tblDATA.区名, tblDATA.属性, "低層"
HAVING (((tblDATA.属性)=-1));
#########################################

の二つのクエリを作ります。これらを各階層ごとに
"低層" AS 階層

WHERE (((tblDATA.建物階数) Between 0 And 2))
の階数を変化させたもの、および
HAVING (((tblDATA.属性)=-1))
の属性を変化させたものを2つづつ作ります。
これらのクエリはそれぞれが属性と階層で分けられて
いるので、これらを足せばデータが得られる
ということになります。
それらをUNIONクエリの中でつなげればデータが一応でます。

つまり、

SELECT ・・・・・・・・・・・
UNION SELECT ・・・・・・
UNION SELECT ・・・・・・
UNION SELECT ・・・・・・
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
UNION SELECT ・・・・・・;

のような構文です。以下全文。
##########################################
SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計, tblDATA.属性,

"低層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 0 And 2))
GROUP BY tblDATA.区名, tblDATA.属性, "低層"
HAVING (((tblDATA.属性)=0))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "低層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 0 And 2))
GROUP BY tblDATA.区名, tblDATA.属性, "低層"
HAVING (((tblDATA.属性)=-1))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "中層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 3 And 5))
GROUP BY tblDATA.区名, tblDATA.属性, "中層"
HAVING (((tblDATA.属性)=0))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "中層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 3 And 5))
GROUP BY tblDATA.区名, tblDATA.属性, "中層"
HAVING (((tblDATA.属性)=-1))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "中高層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 6 And 9))
GROUP BY tblDATA.区名, tblDATA.属性, "中高層"
HAVING (((tblDATA.属性)=0))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "中高層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 6 And 9))
GROUP BY tblDATA.区名, tblDATA.属性, "中高層"
HAVING (((tblDATA.属性)=-1))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "高層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 10 And 63))
GROUP BY tblDATA.区名, tblDATA.属性, "高層"
HAVING (((tblDATA.属性)=0))

UNION SELECT tblDATA.区名, Sum(tblDATA.建物面積) AS 建物面積の合計, Sum(tblDATA.土地面積) AS 土地面積の合計,

tblDATA.属性, "高層" AS 階層, Count(tblDATA.ID) AS 個数
FROM tblDATA
WHERE (((tblDATA.建物階数) Between 10 And 63))
GROUP BY tblDATA.区名, tblDATA.属性, "高層"
HAVING (((tblDATA.属性)=-1));
##############################################
何か違っていたらいじくってみてください。

23x2x4=[東京23区]x[属性]x[階層]=184・・・・・・。
    • good
    • 0

>(全ての条件を満たし?)1つのクエリで表すことは可能でしょうか?



可能・不可能(Yes/No)の御質問をされておりますので・・・
可能というのが「御質問の答え」になります。

御質問の主旨は、「可能ならば教えて頂きたい」ということだと推測しますので、余談として記入します。


作成環境は・・・Access2003 SP3 

御説明の各項目のデータ属性に関して、具体的な御説明が無いため、これも推測で設定しています。
※特に要となる「階数」のデータ形式が不明なので、「単なる数値(階数)のみ」として扱います。

「階数」を範囲指定&グループ化する方法は、
クエリ作成画面で、空行の「フィールド」欄を右クリックし「ビルド」を選択。
式ビルダ内で・・・
階層: Switch((住所一覧!階数<=2),"低層",(3<=住所一覧!階数 And 5>=住所一覧!階数),"中層",6<=住所一覧!階数 And 9>=住所一覧!階数,"中高層",10<=住所一覧!階数,"高層")
・・・と記述し、集計欄を「グループ化」指定。

添付画像のクエリを、SQLビューで表示すると以下の様になります。

SELECT 住所一覧.区名, Switch((住所一覧!階数<=2),"低層",(3<=住所一覧!階数 And 5>=住所一覧!階数),"中層",6<=住所一覧!階数 And 9>=住所一覧!階数,"中高層",10<=住所一覧!階数,"高層") AS 階層, 住所一覧.属性, Sum(住所一覧.建物面積) AS 面積の合計, Sum(住所一覧.土地面積) AS 土地面積の合計, Count(住所一覧.ID) AS IDのカウント
FROM 住所一覧
GROUP BY 住所一覧.区名, Switch((住所一覧!階数<=2),"低層",(3<=住所一覧!階数 And 5>=住所一覧!階数),"中層",6<=住所一覧!階数 And 9>=住所一覧!階数,"中高層",10<=住所一覧!階数,"高層"), 住所一覧.属性;

ちなみに・・・
対象データの組み合わせ数が多いため、大したデバッグはしていませんので、不備がある場合には御自身で修正して下さい。


こういった技術的なカテでの質問時には「自分が作る(または回答する)場合」を想定し、必要な情報を記入する(≠曖昧)ようにしないと、良くても曖昧な回答しか得られません。

あげ足を取られる様な文章での質問は、回答側へ「質問者の意図と違う解釈をさせる」ことになり、善意でくれる回答側へ無駄な労力をかけさせることになり、恩を仇で返す非常識な結果になります。

(御説明の主旨から、本来の質問部分を推測しての回答ですので、的を外した説明部分があるかも知れませんが、)質問者さんの「記入した質問」への回答+その証明・・とも解釈できる回答を寄せます。

参考URL:http://www.accessclub.jp/
「Access 2007でのクエリ集計で複」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!