Definieren Sie dynamisch einen Bereich in einer Dimension


18

Ich habe jedes Mal ein Problem, wenn ich mich entscheide, einen Würfel zu bauen, und ich habe noch keinen Weg gefunden, es zu überwinden.

Die Frage ist, wie der Benutzer eine Reihe von Dingen automatisch definieren kann, ohne sie in der Dimension fest codieren zu müssen. Ich werde mein Problem an einem Beispiel erläutern.

Ich habe eine Tabelle namens Kunden :

Tabellenstruktur

Dies sind die Daten in der Tabelle:

Tabelle mit Daten

Ich möchte die Daten in einem Pivot-Stil anzeigen und das Gehalt und das Alter in definierten Bereichen wie folgt gruppieren :

Tabelle mit Daten mit definiertem Bereich

Ich habe dieses Skript geschrieben und die Bereiche definiert:

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

Meine Bereiche sind fest codiert und definiert. Wenn ich die Daten nach Excel kopiere und sie in einer Pivot-Tabelle ansehe, sieht das wie folgt aus:

Daten in der Pivot-Tabelle

Mein Problem ist, dass ich einen Cube erstellen möchte, indem ich die Customers- Tabelle in eine Faktentabelle umwandle und 2 Dimensionstabellen SalaryDim & AgeDim erstelle .

Die SalaryDim- Tabelle enthält 2 Spalten ( SalaryKey, SalaryRange ) und die AgeDim- Tabelle ist ähnlich ( ageKey, AgeRange ). Meine Kundenfaktentabelle enthält:

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

Ich muss noch meine Bereiche innerhalb dieser Dimensionen definieren. Jedes Mal, wenn ich einen Excel-Pivot mit meinem Cube verbinde, werden nur diese fest codierten Bereiche angezeigt.

Meine Frage ist, wie man Bereiche dynamisch direkt aus der Pivot-Tabelle heraus definiert, ohne die Bereichsdimensionen wie AgeDim und SalaryDim zu erstellen . Ich möchte nicht nur an den in der Dimension definierten Bereichen festhalten.

Kein Bereich definiert

Der definierte Bereich ist '0-25', '26 -30 ', '31 - 50'. Ich möchte es möglicherweise in "0-20", "21 -31", "32 -42" usw. ändern, und Benutzer fordern jedes Mal andere Bereiche an.

Jedes Mal, wenn ich es ändere, muss ich die Dimension ändern. Wie kann ich diesen Prozess verbessern?

Es wäre großartig, eine Lösung im Cube implementieren zu lassen, damit jedes BI-Client-Tool, das eine Verbindung zum Cube herstellt, die Bereiche definieren kann, aber es würde mir nichts ausmachen, wenn es nur eine gute Möglichkeit gibt, Excel zu verwenden.

Antworten:


12

SO MACHEN SIE DAS MIT T-SQL:

Wie gewünscht ist dies eine Alternative zu meiner vorherigen Antwort, in der gezeigt wurde, wie dies pro Benutzer mit Excel durchgeführt wird. Diese Antwort zeigt, wie Sie dasselbe gemeinsam / zentral mit T-SQL tun können. Ich weiß nicht, wie man Cubes, MDX oder das SSAS-Zeug dafür macht, also kann vielleicht Benoit oder jemand, der das weiß, sein Äquivalent posten ...

1. Fügen Sie SalaryRanges SQL Table und View hinzu

Erstellen Sie eine neue Tabelle mit dem Namen "SalaryRangeData" mit dem folgenden Befehl:

Create Table SalaryRangeData(MinVal INT Primary Key)

Fügen Sie berechnete Spalten hinzu, indem Sie sie mit dem folgenden Befehl in eine Ansicht einschließen:

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

Klicken Sie mit der rechten Maustaste auf die Tabelle in SSMS und wählen Sie "Top 200 Zeilen bearbeiten". Geben Sie dann die folgenden Werte in die MinVal-Zellen ein: 0, 501, 1001 und 2001 (die Reihenfolge spielt für SQL Server keine Rolle, sie wird für uns erstellt). Schließen Sie den Tabellenzeilen-Editor und klicken Sie SELECT * FROM SalaryRangesauf, um alle Zeilen- und Bereichsinformationen anzuzeigen.

2. Fügen Sie AgeRanges SQL Table und View hinzu

Machen Sie genau die gleichen Schritte wie in # 1 oben, außer dass Sie alle Vorkommen von "Gehalt" durch "Alter" ersetzen. Dies sollte die Tabelle "AgeRangeData" und die Ansicht "AgeRanges" machen.

Geben Sie die folgenden Werte in die Spalte AgeRangeData [MinVal] ein: 0, 15, 20, 30 und 40.

3. Fügen Sie den Daten Bereiche hinzu

Ersetzen Sie Ihre SELECT-Anweisung durch CASE-Ausdrücke, um die Daten und Bereiche mit den folgenden abzurufen:

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. Alles andere, das Gleiche wie jetzt

Tun Sie von jetzt an einfach alles so, wie Sie es gerade sind. Die Bereiche sollten wie derzeit in Ihrer PivotTable angezeigt werden.

5. Testen Sie die Magie

Wechseln Sie erneut zum Tabellenzeilen-Editor SalaryRangeData in SSMS, löschen Sie die vorhandenen Zeilen und fügen Sie die folgenden Werte ein: 0, 101, 201, 301, ... 2001 (auch hier spielt die Reihenfolge für die T-SQL-Lösung keine Rolle) . Kehren Sie zu Ihrer PivotTable zurück und aktualisieren Sie die Daten. Und genau wie bei der Excel-Lösung sollten die PivotTable-Bereiche automatisch geändert werden.


Zusatz

WIE FÜGEN SIE ES EINEM WÜRFEL HINZU:

1. Erstellen Sie eine Ansicht

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. Erstellen Sie ein BI-Projekt in Visual Studio und fügen Sie das hinzu CustomerView

Stellen Sie eine Verbindung zur Datenbank her, und fügen Sie die CustomerViewAnsicht in die Data Source ViewsFaktentabelle ein

Datenquellensichten

2. Erstellen Sie einen Cube und definieren Sie Measure & Dimension

Wir benötigen nur customerId als Maß für die Kundenzahl und haben dieselbe Faktentabelle als Dimension

Maße

Maße

3. Fügen Sie der Dimension Attribute hinzu

Fügen Sie der Dimension Bereiche als Attribute hinzu

4. Stellen Sie aus Excel eine Verbindung zu Cube her

Hinzufügen einer SSAS-Quelle zu Excel

Wähle den Würfel aus

5. Zeigen Sie die Daten des Cubes in Excel an

Zeigen Sie den Cube in Excel an

6. Bei Änderungen in den Bereichen wird Dimension & Cube erneut verarbeitet

Wenn Sie die Bereiche ändern müssen, ändern Sie die Daten in SalaryRangeDataund AgeRangeDataund verarbeiten Sie dann einfach die Dimensionen und den Cube erneut


8

SO MACHEN SIE DAS MIT EXCEL

So würde ich es in Excel machen ...

1. Fügen Sie SalaryRanges Excel Table hinzu

Fügen Sie ein neues Arbeitsblatt ein und nennen Sie es "Gehaltsbereiche". Fügen Sie in der ersten Zeile die Textüberschriften "Min", "Max" und "Range" in dieser Reihenfolge hinzu (sollten die Zellen A1, A2 bzw. A3 sein).

Fügen Sie in Zelle B2 die folgende Formel hinzu:

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

Fügen Sie in Zelle C2 die folgende Formel hinzu:

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

Füllen Sie diese beiden Formeln in den Spalten B und C automatisch aus, um die maximale Anzahl von Zeilen zu erhalten, die Sie jemals benötigen könnten (sagen wir 30).

Wählen Sie als nächstes den gesamten Bereich (A1..C31). Gehen Sie zur Registerkarte Einfügen und klicken Sie auf die Schaltfläche Tabelle, um diesen Bereich in eine Excel-Tabelle zu ändern (diese wurden früher als "Listen" bezeichnet). Ändern Sie auf der Registerkarte Design der Tabellentools den Namen dieser Tabelle in "SalaryRanges".

Gehen Sie nun zu Zelle A2 in der Spalte Min und geben Sie "0", "501" in A3, "1001" in Zelle A4 und schließlich "2001" in Zelle A5 ein. Beachten Sie, dass dabei die Spalten MAx und Range automatisch ausgefüllt werden.

2. Fügen Sie eine AgeRanges Excel-Tabelle hinzu

Erstellen Sie nun ein weiteres neues Arbeitsblatt mit dem Namen "Altersbereiche" und führen Sie die gleichen Schritte wie in Nr. 1 oben aus, außer dass Sie diese Tabelle "Altersbereiche" aufrufen und in der Spalte "Min" die Zellen A2 bis A6 mit 0, 15, 20, 30 und füllen 40, um. Auch hier sollten die Werte für Max und Range automatisch eingetragen werden.

3. Holen Sie sich die Daten

Übernehmen Sie die Daten aus der Datenbank wie zuvor in Ihre Excel-Arbeitsmappe (erstellen Sie die PivotTable noch nicht, wie unten beschrieben), mit der Ausnahme, dass Sie die Spalten für die Groß- und Kleinschreibung AgeRange und SalaryRange entfernen sollten.

4. Fügen Sie Ihren Daten die Spalten Gehalt und Altersgruppe hinzu

Fügen Sie in dem Blatt, in dem sich Ihre Daten befinden, eine Spalte "SalaryRange" und "AgeRange" hinzu. Füllen Sie in der Spalte "SalaryRange" die folgende Formel automatisch aus (vorausgesetzt, "D" ist die Spalte "Salary"):

=LOOKUP(D2,SalaryRanges)

Füllen Sie diese Formel automatisch in die Spalte AgeRange aus (vorausgesetzt, "C" ist die Spalte Age):

=LOOKUP(C2,AgeRanges)

5. Erstellen Sie Ihren PivotTable

Tun Sie dies genauso wie zuvor. Beachten Sie, dass die Werte / Bezeichnungen für Alter und Gehaltsbereich mit den von Ihnen ausgewählten Bereichen übereinstimmen.

6. Testen Sie die Magie

Nun der lustige Teil. Wechseln Sie zum Arbeitsblatt SalaryRanges, und geben Sie die Spalte Min erneut ein. Beginnen Sie mit 0, dann mit 101, 201, 301, ... 2001. Wechseln Sie zu PivotTable, und aktualisieren Sie es einfach. Shazaam!


Ich sollte erwähnen, dass Sie den gleichen Effekt natürlich auch erzielen können, indem Sie die Tabellen in SQL einfügen und Ihre SELECT-Anweisung so ändern, dass die LOOKUP (..) als Unterabfrage ausgeführt werden (etwas chaotisch wegen der Bereichsübereinstimmung, aber definitiv nicht. imstande). Der Grund, warum ich es so gemacht habe (in Excel) ist

  1. Das Ändern der Bereiche ist für die meisten Menschen etwas einfacher. Selbst für DBAs und SQL-Entwickler (wie wir) ist dieser Weg ein bisschen einfacher, nur weil er näher an der Benutzeroberfläche / den Ergebnissen liegt.
  2. Auf diese Weise können Ihre Benutzer ihre eigenen Bereiche ändern, ohne Sie zu stören. (Ein großes Plus in meinem Leben)
  3. Dadurch kann jeder Benutzer auch seine eigenen Bereiche definieren.

Manchmal ist es jedoch tatsächlich unerwünscht , dass Benutzer ihre eigenen Bereiche definieren. Wenn dies bei Ihnen der Fall ist, zeige ich Ihnen gerne, wie dies zentral in SQL durchgeführt wird.


+1 und vielen Dank die Lösung funktioniert erstaunlich, die Tabelle mit den Daten mit den Bereichen in Excel zu verbinden. Gibt es eine Möglichkeit, diese definierten Bereiche mit der Pivot-Tabelle zu verbinden, die mit dem Cube verbunden ist, sind meine Pivots direkt mit dem verbunden Würfel in SSAS, und es wäre auch toll, wenn Sie zeigen können, "wie man es zentral macht".
AmmarR

Ich kann Ihnen zeigen, wie man das zentral mit SQL-Ausdrücken macht, das werde ich als alternative Antwort posten. Ich kann die Cube / SSAS-Probleme nicht ansprechen, da ich sie leider nicht kenne. Ja, ich sollte sie kennen und ich wünschte, ich würde es tun, aber ich tue es nicht, also muss sich jemand anderes darum kümmern.
RBarryYoung

5

Mit der MDX-Sprache können Sie benutzerdefinierte Member erstellen, die die Bereiche definieren. Der folgende Ausdruck definiert ein berechnetes Mitglied, das alle Gehälter zwischen 501 und 1000 darstellt:

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

Sie können dasselbe mit der Altersdimension tun:

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

In diesem Artikel wird erläutert, wie diese berechneten Elemente in Excel hinzugefügt werden (siehe Abschnitt ' Berechnete Elemente / Kennzahlen und Gruppen in Excel 2007 OLAP PivotTables erstellen '). Leider gibt es in Excel keine Benutzeroberfläche dafür. Sie können jedoch BI-Clients finden, die die MDX- Sprache unterstützen, mit denen Sie Ihre Bereiche in den Abfragen definieren können.


danke @Benoit, versuche berechnete Felder mit dem gleichen Konzept, das du vorschlägst, in den Cube selbst einzufügen, aber ich scheine noch nicht zu funktionieren, der Prozess ist etwas langwierig und ich bin nicht mit ihm vertraut auch
AmmarR

Vielen Dank @RBarryYoung. @ MarkStorey-Smith: Ich kann die Formeleffizienz verbessern, wenn Sie mir die Liste der Ebenen geben, die sich in der Dimension Salaryund befinden Age.
Benoit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.