ディメンションの範囲を動的に定義する


18

キューブを作成するたびに直面する問題があり、それを克服する方法をまだ見つけていません。

問題は、ディメンション内でハードコードすることなく、ユーザーがさまざまなものを自動的に定義できるようにする方法です。例で問題を説明します。

Customersというテーブルがあります:

テーブル構造

これはテーブル内のデータです。

データ付きの表

ピボットスタイルでデータを表示し、以下のように定義された範囲で給与年齢をグループ化します。

定義された範囲のデータを含むテーブル

このスクリプトを作成し、範囲を定義しました。

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = case
        when cast(salary as float) <= 500 then
            '0 - 500'
        when cast(salary as float) between 501 and 1000 then
            '501 - 1000'
        when cast(salary as float) between 1001 and 2000 then
            '1001 - 2000'
        when cast(salary as float) > 2000 then
            '2001+'
        end,
        [AgeRange] = case
        when cast(age as float) < 15 then
            'below 15'
        when cast(age as float) between 15 and 19 then
            '15 - 19'
        when cast(age as float) between 20 and 29 then
            '20 - 29'               
        when cast(age as float) between 30 and 39 then
            '30 - 39'
        when cast(age as float) >= 40 then
            '40+'
        end
  FROM [Customers]
GO

私の範囲はハードコーディングされ定義されています。データをExcelにコピーしてピボットテーブルで表示すると、次のように表示されます。

ピボットテーブルのデータ

私の問題は、Customersテーブルをファクトテーブルに変換してキューブを作成し、2つのディメンションテーブルSalaryDimAgeDimを作成することです

SalaryDimの表は、2列を有する(SalaryKey、SalaryRange)とAgeDimのテーブルは、(類似しているageKey、AgeRange)。私の顧客ファクトテーブルには、があります。

Customer
[CustId]
[CustName]
[AgeKey] --> foreign Key to AgeDim
[Salarykey] --> foreign Key to SalaryDim

これらのディメンション内で範囲を定義する必要があります。Excelピボットをキューブに接続するたびに、これらのハードコードされた定義範囲のみが表示されます。

私の質問は、AgeDimSalaryDimなどの範囲ディメンションを作成せずに、ピボットテーブルから直接動的に範囲を定義する方法です。ディメンションで定義された範囲だけに固執したくありません。

範囲が定義されていません

定義されている範囲は、「0-25」、「26-30」、「31-50」です。「0-20」、「21-31」、「32-42」などに変更したい場合があり、ユーザーは毎回異なる範囲を要求します。

変更するたびに、ディメンションを変更する必要があります。このプロセスを改善するにはどうすればよいですか?

ソリューションをキューブに実装して、キューブに接続するBIクライアントツールが範囲を定義できるようにすることは素晴らしいことですが、Excelのみを使用する良い方法があるかどうかは気にしません。

回答:


12

T-SQLでこれを行う方法:

要求されたとおり、これは、Excelを使用してユーザーごとに実行する方法を示した以前の回答の代替です。この回答は、代わりにT-SQLを使用して共有/集中的に同じことを行う方法を示しています。私はこれのためにキューブ、MDX、またはSSASのものを行う方法を知らないので、おそらくBenoitまたはそれを知っている誰かが同等のものを投稿することができます...

1. SalaryRanges SQLテーブルとビューを追加します

次のコマンドで「SalaryRangeData」という新しいテーブルを作成します。

Create Table SalaryRangeData(MinVal INT Primary Key)

次のコマンドを使用して、ビューに計算列をラップして計算列を追加します。

CREATE VIEW SalaryRanges As
WITH
  cteSequence As
(
    Select  MinVal,
            ROW_NUMBER() OVER(Order By MinVal ASC) As Sequence
    From    SalaryRangeData
)
SELECT 
    D.Sequence,
    D.MinVal,
    COALESCE(N.MinVal - 1, 2147483645)  As MaxVal,
    CAST(D.MinVal As Varchar(32))
    + COALESCE(' - ' + CAST(N.MinVal - 1 As Varchar(32)), '+')
                        As RangeVals
FROM        cteSequence As D 
LEFT JOIN   cteSequence As N ON N.Sequence = D.Sequence + 1

SSMSでテーブルを右クリックし、「上位200行の編集」を選択します。次に、MinValセルに次の値を入力します:0、501、1001、および2001(SQL Serverの場合、順序は関係ありません。作成されます)。テーブル行エディターを閉じ、a SELECT * FROM SalaryRangesを実行してすべての行と範囲情報を表示します。

2. AgeRanges SQLテーブルとビューを追加する

上記の#1とまったく同じ手順を実行しますが、「給与」の出現箇所をすべて「年齢」に置き換えます。これにより、テーブルが「AgeRangeData」になり、ビューが「AgeRanges」になります。

次の値をAgeRangeData [MinVal]列に入力します:0、15、20、30、および40。

3.データに範囲を追加する

SELECTステートメントを、データと範囲を取得するためのCASE式に次のもので置き換えます。

SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

4.他のすべて、今と同じ

ここからは、現在と同じようにすべてを行います。現在のように、範囲はすべてピボットテーブルに表示されます。

5.テストマジック

SSMSのSalaryRangeDataテーブル行エディターに再度移動し、既存の行を削除してから、次の値を挿入します:0、101、201、301、... 2001(再び、T-SQLソリューションでは順序は関係ありません) 。ピボットテーブルに戻り、データを更新します。また、Excelソリューションと同様に、ピボットテーブルの範囲は自動的に変更されるはずです。


添加

キューブに追加する方法:

1.ビューを作成する

CREATE VIEW CustomerView As
SELECT [CustId]
      ,[CustName]
      ,[Age]
      ,[Salary]
      ,[SalaryRange] = (
            Select RangeVals From SalaryRanges
            Where [Salary] Between MinVal And MaxVal)
      ,[AgeRange] = (
            Select RangeVals From AgeRanges
            Where [Age] Between MinVal And MaxVal)
  FROM [Customers]

1. Visual Studioでaa BIプロジェクトを作成し、追加します CustomerView

データベースに接続し、FactテーブルにCustomerViewビューを追加しData Source Viewsます

データソースビュー

2.キューブを作成し、メジャーとディメンションを定義する

顧客数の尺度としてcustomerIdのみが必要であり、ディメンションと同じファクトテーブルを持ちます。

対策

寸法

3.ディメンションへの属性の追加

範囲を属性としてディメンションに追加します

4. ExcelからCubeに接続する

SSASソースをExcelに追加する

キューブを選択

5. Excelでキューブのデータを表示する

Excelでキューブを表示する

6.範囲の変更については、ディメンションとキューブを再処理するだけです

範囲を変更する必要がある場合は、SalaryRangeDataおよびのデータを変更してからAgeRangeData、ディメンションとキューブを再処理します。


8

Excelでこれを行う方法

Excelで行う方法は次のとおりです...

1. SalaryRanges Excelテーブルを追加する

新しいワークシートを挿入し、「給与範囲」と呼びます。行1に、テキストヘッダー「Min」、「Max」、および「Range」をこの順序で追加します(それぞれセルA1、A2、A3である必要があります)。

セルB2に次の数式を追加します。

=IF(A2="","",IF(A3="","+",A3-1))

セルC2に次の数式を追加します。

=IF(B2="","",A2 & IF(B2="+",""," - ") & B2)

これら2つの数式をB列とC列に自動入力して、必要な最大行数(たとえば30行)にします。

次に、範囲全体(A1..C31)を選択します。[挿入]タブに移動し、[テーブル]ボタンをクリックして、この範囲をExcelテーブル(これらは "リスト"と呼ばれていました)に変更します。[テーブルツールのデザイン]タブで、このテーブルの名前を「SalaryRanges」に変更します。

ここで、最小列のセルA2に移動し、「0」、「A3」に「501」、セルA4に「1001」、最後にセルA5に「2001」を入力します。これを行うと、MAx列とRange列が自動的に埋められることに注意してください。

2. AgeRanges Excelテーブルを追加する

次に、「Age Ranges」という名前の別の新しいワークシートを作成し、上記の#1とまったく同じ手順を実行します。ただし、このテーブルを「AgeRanges」と呼び、Min列でセルA2からA6に0、15、20、30、 40、順番に。繰り返しますが、MaxとRangeの値は、進むにつれて自動的に埋められます。

3.データを取得する

AgeRangeおよびSalaryRangeケース関数の列を削除する必要があることを除いて、以前と同じようにデータベースからデータをExcelブックに取得します(まだピボットテーブルを作成しないでください。以下を行います)。

4.給与と年齢層の列をデータに追加します

データがあるシートで、「SalaryRange」列と「AgeRange」列を追加します。SalaryRange列で、次の式を自動入力します(「D」がSalary列であると仮定します)。

=LOOKUP(D2,SalaryRanges)

そして、この式をAgeRange列に自動入力します(「C」がAge列であると仮定):

=LOOKUP(C2,AgeRanges)

5.ピボットテーブルを作成する

これを前と同じように行います。年齢と給与の範囲の値/ラベルは、選択した範囲と一致することに注意してください。

6.マジックをテスト

今から楽しい部分です。SalaryRangesワークシートに移動し、0から始めて101、201、301、... 2001の順にMin列を再入力します。PivotTableに戻って更新します。シャザーム!


もちろん、SQLにテーブルを配置し、SELECTステートメントを変更してサブクエリとしてLOOKUP(..)sを実行することでも同じ効果を達成できることを言及する必要があります(範囲一致のために少し面倒ですが、間違いなく-できる)。この方法で(Excelで)した理由は

  1. ほとんどの人にとって、範囲の変更は少し簡単です。DBAやSQL開発者(私たちのような)にとっても、この方法はUI /結果に近いという理由だけで少し簡単です。
  2. これにより、ユーザーは気にせずに自分の範囲を変更できます。(私の人生で大きなプラス)
  3. これにより、各ユーザーが独自の範囲を定義することもできます。

ただし、ユーザーが独自の範囲を定義することは実際には望ましくない場合があります。その場合は、SQLで代わりに一元的に行う方法を紹介させていただきます。


+1とありがとうございますSSASでキューブを作成します。また、「集中的に行う方法」を示すことができれば素晴らしいと思います。
-AmmarR

SQL式を使用して一元的に実行する方法を示すことができますが、代わりの回答としてそれを投稿します。Cube / SSASの問題に対処することはできません。残念ながら、私はそれらを知りません。はい、私それらを知っている必要があり、私はしたいのですが、私知らないので、他の誰かがそれに対処する必要があります。
–RBarryYoung

5

MDX言語を使用すると、範囲を定義するカスタムメンバーを作成できます。次の式は、501から1000までのすべての給与を表す計算メンバーを定義しました。

MEMBER [Salary].[between_500_and_1000] AS Aggregate(Filter([Salary].Members, [Salary].CurrentMember.MemberValue > 500 AND [Salary].CurrentMember.MemberValue <= 1000))

年齢ディメンションでも同じことができます。

MEMBER [Age].[between_0_and_25] AS Aggregate(Filter([Age].Members, [Age].CurrentMember.MemberValue <= 25))

この記事では、計算されたこれらのメンバーをExcelに追加する方法について説明します(「Excel 2007 OLAPピボットテーブルで計算メンバー/メジャーおよびセット作成」セクションを参照)。残念ながら、ExcelにはこのためのUIはありません。それにもかかわらず、クエリで範囲を定義できるMDX言語をサポートするBIクライアントを見つけることができます。


おかげで@Benoit、あなたが提案しているのと同じコンセプトで計算フィールドを自分でキューブに追加しようとしていますが、私はまだ動作していないようです、プロセスは少し長く、それに慣れていません同様に、
-AmmarR

ありがとう@RBarryYoung。@ MarkStorey-Smith:Salaryand Ageディメンションにあるレベルのリストを教えてくれれば、数式の効率を改善できます。
ブノワ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.