Dynamicznie określ zakres w wymiarze

18

Mam problem, z którym spotykam się za każdym razem, gdy decyduję się na zbudowanie sześcianu, i jeszcze nie znalazłem sposobu na jego rozwiązanie.

Problem polega na tym, jak zezwolić użytkownikowi na automatyczne definiowanie zakresu rzeczy bez konieczności kodowania ich na stałe w wymiarze. Wyjaśnię mój problem na przykładzie.

Mam tabelę o nazwie Klienci :

Struktura tabeli

to są dane w tabeli:

Tabela z danymi

Chcę wyświetlać dane w stylu przestawnym i grupować wynagrodzenie i wiek w określonych zakresach, takich jak poniżej:

Tabela z danymi o zdefiniowanym zakresie

Napisałem ten skrypt i zdefiniowałem zakresy:

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

Moje zakresy są zakodowane na stałe i zdefiniowane. Kiedy kopiuję dane do Excela i przeglądam je w tabeli przestawnej, wygląda to tak jak poniżej:

Dane w tabeli przestawnej

Mój problem polega na tym, że chcę utworzyć kostkę, przekształcając tabelę klientów w tabelę faktów i tworząc tabele 2 wymiarów SalaryDim i AgeDim .

SalaryDim tabeli ma 2 kolumny ( SalaryKey, SalaryRange ) i AgeDim tabela jest podobna ( ageKey, ZakresWieku ). Tabela faktów mojego klienta zawiera:

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

Nadal muszę zdefiniować zakresy w tych wymiarach. Za każdym razem, gdy podłączam element przestawny Excela do mojej kostki, widzę tylko te zdefiniowane na stałe zakresy.

Moje pytanie dotyczy tego, jak dynamicznie definiować zakresy bezpośrednio z tabeli przestawnej, bez tworzenia wymiarów zakresu, takich jak AgeDim i SalaryDim . Nie chcę utknąć tylko w zakresach zdefiniowanych w wymiarze.

Brak zdefiniowanego zakresu

Określony zakres to „0–25”, „26–30”, „31–50”. Może chciałbym zmienić to na „0-20”, „21-31”, „32-42” itd., A użytkownicy za każdym razem żądają różnych zakresów.

Za każdym razem, gdy go zmieniam, muszę zmieniać wymiar. Jak mogę ulepszyć ten proces?

Byłoby wspaniale mieć rozwiązanie zaimplementowane w kostce, aby dowolne narzędzie klienckie BI łączące się z kostką mogło zdefiniować zakresy, ale nie miałbym nic przeciwko, jeśli istnieje dobry sposób używania tylko Excela.

AmmarR
źródło

Odpowiedzi:

12

JAK TO ZROBIĆ T-SQL:

Zgodnie z życzeniem jest to alternatywa dla mojej poprzedniej odpowiedzi, która pokazała, jak to zrobić dla użytkownika za pomocą programu Excel. Ta odpowiedź pokazuje, jak zrobić to samo wspólnie / centralnie za pomocą T-SQL. Nie wiem, jak zrobić w tym celu kostki, MDX lub SSAS, więc może Benoit lub ktoś, kto wie, że może opublikować odpowiednik ...

1. Dodaj tabelę i widok SalaryRanges SQL

Utwórz nową tabelę o nazwie „SalaryRangeData” za pomocą następującego polecenia:

Create Table SalaryRangeData(MinVal INT Primary Key)

Dodaj kolumny obliczeniowe, zawijając je w widoku za pomocą tego polecenia:

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

Kliknij prawym przyciskiem myszy tabelę w SSMS i wybierz „Edytuj 200 najlepszych wierszy”. Następnie wprowadź następujące wartości w komórkach MinVal: 0, 501, 1001 i 2001 (kolejność nie ma znaczenia dla SQL Server, stworzy ją dla nas). Zamknij edytor wierszy tabeli i zrób a, SELECT * FROM SalaryRangesaby zobaczyć wszystkie informacje o wierszach i zakresie.

2. Dodaj tabelę i widok SQL AgeRanges

Wykonaj dokładnie te same kroki, co w punkcie 1 powyżej, z tym wyjątkiem, że wszystkie wystąpienia „Wynagrodzenia” zamień na „Wiek”. Powinno to sprawić, że tabela „AgeRangeData” i widok „AgeRanges”.

Wprowadź następujące wartości w kolumnie AgeRangeData [MinVal]: 0, 15, 20, 30 i 40.

3. Dodaj zakresy do danych

Zastąp instrukcję SELECT wyrażeniami CASE służącymi do pobierania danych i zakresów następującymi:

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. Wszystko inne, tak samo jak teraz

Odtąd rób wszystko tak samo, jak obecnie. Wszystkie zakresy powinny pojawiać się w tabeli przestawnej tak, jak obecnie.

5. Przetestuj magię

Przejdź ponownie do edytora wierszy tabelarycznych SalaryRangeData w SSMS i usuń istniejące wiersze, a następnie wstaw następujące wartości: 0, 101, 201, 301, ... 2001 (ponownie kolejność nie ma znaczenia dla rozwiązania T-SQL) . Wróć do tabeli przestawnej i odśwież dane. I podobnie jak rozwiązanie Excel, zakresy tabeli przestawnej powinny zostać automatycznie zmienione.


Dodanie

JAK DODAĆ DO KOSTKI:

1. Utwórz widok

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. Utwórz projekt BI w Visual studio i dodaj CustomerView

Połącz się z bazą danych i dodaj CustomerViewwidok w Data Source Viewstabeli faktów

Widoki źródła danych

2. Utwórz sześcian i zdefiniuj miarę i wymiar

potrzebujemy tylko customerId, jako miernika liczby klientów i będziemy mieć tę samą tabelę faktów co wymiar

Środki

Wymiary

3. Dodaj atrybuty do wymiaru

Dodaj zakresy jako atrybuty do wymiaru

4. Połącz się z Cube z Excela

Dodaj źródło SSAS do programu Excel

Wybierz kostkę

5. Wyświetl dane kostki w Excelu

Wyświetl moduł w programie Excel

6. W przypadku wszelkich zmian w zakresach wystarczy ponownie przetworzyć wymiar i kostkę

jeśli trzeba zmienić zakresach, zmienić dane w SalaryRangeDatai AgeRangeDataa potem po prostu przerabiają wymiary i kostki

RBarryYoung
źródło
8

JAK TO ROBIĆ W EXCELU

Oto jak zrobiłbym to w Excelu ...

1. Dodaj tabelę SalaryRanges Excel

Wstaw nowy arkusz, nazwij go „Zakresami wynagrodzeń”. W pierwszym rzędzie dodaj nagłówki tekstu „Min”, „Max” i „Range” w tej kolejności (powinny to być odpowiednio komórki A1, A2, A3).

W komórce B2 dodaj następującą formułę:

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

W komórce C2 dodaj tę formułę:

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

Wypełnij te dwie formuły automatycznie w kolumnach B i C, aby uzyskać maksymalną liczbę wierszy, których możesz potrzebować (powiedzmy 30).

Następnie wybierz cały zakres (A1..C31). Przejdź do zakładki Wstaw i kliknij przycisk Tabela, aby zmienić ten zakres na tabelę programu Excel (kiedyś nazywano je „listami”). Na karcie Projektowanie narzędzi tabel zmień nazwę tej tabeli na „SalaryRanges”.

Teraz przejdź do komórki A2 w kolumnie Min i wpisz „0”, „501” w A3, „1001” w komórce A4 i na koniec „2001” w komórce A5. Zauważ, że w ten sposób kolumny MAx i Range są automatycznie wypełniane.

2. Dodaj tabelę AgeRanges Excel

Teraz utwórz kolejny nowy arkusz roboczy o nazwie „Przedziały wiekowe” i wykonaj dokładnie te same kroki, co w punkcie 1 powyżej, z tą różnicą, że nazwij tę tabelę „Przedziały wiekowe” i w kolumnie Min wypełnij komórki od A2 do A6 cyframi 0, 15, 20, 30 i 40, w kolejności. Ponownie, wartości Max i Range powinny automatycznie wypełniać się w miarę postępów.

3. Uzyskaj dane

Pobierz dane z bazy danych do skoroszytu programu Excel tak jak wcześniej (nie twórz jeszcze tabeli przestawnej, robimy to poniżej), z tym wyjątkiem, że powinieneś usunąć kolumny funkcji Sprawa AgeRange i SalaryRange.

4. Dodaj kolumny Dane wynagrodzenia i Zakres wieku do swoich danych

W arkuszu, w którym znajdują się Twoje dane, dodaj kolumny „SalaryRange” i „AgeRange”. W kolumnie SalaryRange wypełnij automatycznie następującą formułę (zakłada, że ​​„D” to kolumna Wynagrodzenie):

=LOOKUP(D2,SalaryRanges)

I automatycznie wypełnij tę formułę w kolumnie AgeRange (zakładając, że „C” to kolumna Age):

=LOOKUP(C2,AgeRanges)

5. Utwórz tabelę przestawną

Zrób to tak jak wcześniej. Pamiętaj, że wartości / etykiety przedziałów wiekowych i wynagrodzeń odpowiadają wybranym zakresom.

6. Przetestuj magię

Teraz część zabawy. Przejdź do arkusza SalaryRanges i ponownie wprowadź kolumnę Min, zaczynając od 0, a następnie 101, 201, 301, ... 2001. Wróć do tabeli przestawnej i odśwież ją. Shazaam!


Powinienem wspomnieć, że oczywiście można również osiągnąć ten sam efekt, umieszczając tabele w SQL i zmieniając instrukcję SELECT, aby wykonać WYSZUKAJ (..) jako podzapytanie (trochę niechlujne ze względu na dopasowanie zakresu, ale zdecydowanie robi- zdolny). Powodem, dla którego to zrobiłem w ten sposób (w programie Excel) jest

  1. Zmiana zakresów jest nieco łatwiejsza dla większości ludzi. Nawet dla programistów DBA i SQL (takich jak my) ten sposób jest nieco łatwiejszy tylko dlatego, że jest bliżej interfejsu użytkownika / wyników.
  2. Pozwala to użytkownikom zmieniać własne zakresy bez konieczności martwienia się o ciebie. (DUŻY plus w moim życiu)
  3. Pozwala to również każdemu użytkownikowi zdefiniować własne zakresy.

Czasami jednak nie jest pożądane, aby użytkownicy definiowali własne zakresy. Jeśli tak jest w twoim przypadku, z przyjemnością pokażę, jak to zrobić centralnie, zamiast tego w języku SQL.

RBarryYoung
źródło
+1 i dzięki, że rozwiązanie działa niesamowicie, łącząc tabelę z danymi z zakresami wszystko w excelu, Czy istnieje sposób na połączenie tych zdefiniowanych zakresów z tabelą przestawną, która jest podłączona do kostki, moje osie są bezpośrednio połączone z moduł w SSAS, a także byłoby świetnie, gdybyś mógł pokazać „jak to zrobić centralnie”.
AmmarR
Mogę pokazać, jak to zrobić centralnie za pomocą wyrażeń SQL, podam to jako alternatywną odpowiedź. Nie mogę rozwiązać problemów z kostką / SSAS, ponieważ niestety ich nie znam. Tak, powinienem je znać i żałuję, że nie wiem, ale nie wiem, więc ktoś inny będzie musiał się tym zająć.
RBarryYoung
5

Za pomocą języka MDX można tworzyć niestandardowe elementy, które będą definiować zakresy. Poniższe wyrażenie zdefiniowało obliczonego członka, który reprezentuje wszystkie wynagrodzenia między 501 a 1000:

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

Możesz zrobić to samo z wymiarem wieku:

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

W tym artykule wyjaśniono, jak dodawać te obliczone elementy w programie Excel (patrz sekcja „ Tworzenie obliczonych elementów / miar i zestawów w tabelach przestawnych OLAP programu Excel 2007 ”). Niestety w programie Excel nie ma interfejsu użytkownika. Niemniej jednak można znaleźć klientów BI obsługujących język MDX , które pozwalają zdefiniować zakresy w zapytaniach.

Benoit
źródło
dzięki @Benoit, próbuję dodać pola obliczeniowe do kostki samodzielnie z tą samą koncepcją, którą sugerujesz, ale wydaje mi się, że jeszcze nie działa, proces jest nieco długi i nie jestem z nim zaznajomiony, spróbuję go z Excelem również
AmmarR,
Dzięki @RBarryYoung. @ MarkStorey-Smith: Mogę poprawić wydajność formuły, jeśli podasz mi listę poziomów, które znajdują się w wymiarze Salaryi Age.
Benoit,