質問
私は MDX を初めて使用するので、これは単純な質問であることはわかっていますが、答えが見つかりませんでした。
質問と回答のあるアンケートをモデル化しています。私が達成しようとしているのは、質問に対して具体的な回答をした人の数を調べることです。20~25歳の男性の数
質問に対して個別に以下のクエリを実行すると、正しい結果が返されます。
SELECT
[Measures].[Fact Demographics Count] ON Columns
FROM
[Dsv All]
WHERE
[Answer].[Dim Answer].&[1]
[Measures].[Fact Demographics Count]
主キー列の数です
[Answer].[Dim Answer].&[1]
男性の答えの鍵は
男性の数の結果、20〜25 = 12の間の人の結果150人の結果
ただし、20 ~ 25 歳の男性の数を取得するのではなく、次のクエリを実行すると、男性の人数と 20 ~ 25 歳の人の数の合計を取得します。
SELECT
[Measures].[Fact Demographics Count] ON Columns
FROM
[Dsv All]
WHERE
{[Answer].[Dim Answer].&[1],[Answer].[Dim Answer].&[9]}
結果 = 162
ファクトテーブルの構造は次のとおりです。
事実人口統計キー、
回答者キー、
質問キー、
解答
助けていただければ幸いです
ありがとう
解決 3
まず、ご返信いただきました皆様に感謝いたします。これは解決するのに興味深い問題でしたが、MDX を初めて使用する人や SQL から来た人にとっては、陥りやすい罠です。
興味のある方のために、ここでソリューションの概要を簡単に説明します。
テーブルが3つあります
事実人口統計:回答者とその回答 (誰が何を回答したか) を保持します
暗い答え:回答
暗い回答者:回答者
キューブのデータソース ビューで、名前付きクエリを使用してactDemographicsを5回複製し、これらにfact1、fact2、...、fact5という名前を付けました。(5 つのメジャー グループが作成されます)
VS Studio のキューブ作成ウィザードを使用して、次のファクト テーブルを設定しました
- 事実 1、事実 2、...ファクトテーブルとして
- dimRespondent ファクト テーブル。このテーブルを使用して回答者の数を取得します。
- 元の fatDemographics テーブルを削除しました。
キューブが作成されたら、dimAnswer ディメンションを 5 回複製し、filter1、filter2、... という名前を付けました。
最後に、キューブ構造のディメンション使用タブで、次のようにこれらをリンクしました。
filter1 多対多 dim応答者
filter2 多対多 dimRespondent
filter3 多対多 dim応答者
filter4 多対多 dimRespondent
filter5 多対多 dim応答者
フィルター1 通常の関係事実1
フィルター2 通常の関係事実2
フィルター3 通常の関係事実3
フィルター4 通常の関係事実4
フィルター5 通常の関係事実5
これにより、元の投稿で使用したクエリを次のように書き直すことができるようになりました。
SELECT
[Measures].[Dim Respondent Count] On 0
FROM
[DemographicsCube]
WHERE
(
[Filter1].[Answer].&[Male],
[Filter2].[Answer].&[20-25]
)
クエリを最大 5 つの質問でフィルターできるようになりました。
これは機能しますが、もっと洗練された解決策があると確信しています。それが何なのか知っている人がいたら、ぜひ聞きたいです。
ありがとう
他のヒント
MDX関数FILTERを見てください - これはあなたが必要なものを与えることができます。 IDさんに対してフィルタリングするフィルタと、メンバーのプロパティの組み合わせは、それを行う可能性があります。年齢と性別が同じ寸法(回答)の両方のメンバーであるため、何をやろうとしていることことを意味し、(私の経験から)OLAPキューブが構成されているかの穀物に対して少しあるので、あなたは問題を抱えています彼らはそれぞれ、集約のための自分自身の細胞を得るが、年齢と性別が自分の寸法にそれぞれした場合とは異なり、彼らは一緒に追加取得することを除いて、互いに対して集約されません。あなたが欲しいものですが、同じディメンションのメンバ - OLAPキューブでは、他のすべてのディメンションの各メンバーと各次元の各メンバーの各組み合わせは、その組み合わせに固有の各メジャーの値を持つ「セル」を取得します(例えば、回答など)そのようにクロス計算されない。
可能であれば、私は個々の寸法に個別の回答を飛び出し推薦する、すなわち、年齢と性別、それぞれが、自分のメンバーと自分の寸法を有している、あなたは自然にあなたのキューブの外に流れます何をしたいのか。そうでなければ、私はあなたがするMDXのfiddelryがたくさんあるだろう怖いです。 (私も、MDXの専門家ではないですので、私はこの1つに完全にオフベースかもしれないが、それは私の理解である)
これはあなたが書く必要があると思うだけMDXクエリがある場合を除きまた、確かに、以前、MDXソリューションを述べた本を読みました。 MDXと多次元分析は、の何もないのSQLのようなものであり、一般的にはOLAPデータベースおよびMDXの構造の固体理解が不可欠であり、その本がどこにあなたを得るための非常に、非常に素晴らしい仕事をしていませんその部門にする必要があります。
するとき、私はあなたが寸法ではなく、対策ににスライスしている項目内訳にそれが参考どこ-基準またはスライスの問題を把握しようとしてます。
select
[Measures].[Fact Demographics Count] on Columns
from [Dsv All]
where
{
[Answer].[Dim Answer].&[1],
[Dim Age Band].[20-25]
}
は、あなたが本当にMDXの電源を使用していないが - 。あなただけの一つの値を取得している。
select
[Dim Answer].Members on Columns,
[Dim Age Band].Members on Rows
from [Dsv All]
where ( [Measures].[Fact Demographics Count] )
(行の)年齢バンドによって(カラム上)性別を破壊するあなたのピボットテーブル(またはクロスタブ)を提供します。
ところで - あなたはこの本MDXを学んでいるFF: MDXソリューションズする遠く離れた私が見つけた最高の出発点です。
あなたはMSSQLを使用している場合は、あなたが欲しい情報を持つことになり、いくつかの余分な行を取得するには、「ROLLUP WITH」を使用することができます。また、あなたが必要になります「GROUP BY」を使用していません。
のグループに集合を分割して、あなたのカウントや他の統計情報を取得するには、集計関数を使用するGROUP BYを使用します。
例:
select AGE, GENDER, count(1)
from MY_TABLE
group by AGE, GENDER
with rollup
この各年齢群では、あなたのテーブルにいる人の男女それぞれの数を与え、男女を問わず、各年齢層の番号、あなたのテーブルの人々の総数を与えるだろう「ロールアップ」、となり男女それぞれの数字は、年齢に関係なく。
のようなものAGE GENDER COUNT
--- ------ -----
20 M 1245
21 M 1012
20 F 942
21 F 838
M 2257
F 1780
20 2187
21 1850
4037