Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Nie wiem jak sobie z tym poradzić. Dopiero poznaję szerzej SSAS i mam problem, którego nie potrafię do końca rozgryźć.

Mam z grubsza tabele:

Sprzedaz
-------
id (INT IDENTITY)
handlowiecId (INT)
punktId (INT)
pozycjaId (INT)
ilość (NUMERIC)
data (DATE)

Grupowanie
-------
grupaId (INT)
pozycjaId (INT)

SlownikGrup
---------
[K] grupaId (INT)
nazwa (NVARCHAR)

SlownikPozycji
---------
[K] pozycjaId (INT)
nazwa (NVARCHAR)


Plus inne nieistotne teraz słowniki, np. handlowców i punktów sprzedaży. [K] oznacza klucz główny.

Tabela 'Sprzedaz' to fakty dotyczące sprzedaży. Odnotowywane są zdarzenia dotyczące sprzedaży danych pozycji (pozycjaId). Pozycje moga być dostepne w różnych grupach, a informacje o takich przypisaniach są w tabeli 'Grupowanie'. Żeby użytkownik w docelowej kostce nie musiał nawigować po numerach dołączone są słowniki pozycji i grup.

Problem: Nie potrafię zmusic kostki do przeprocesowania i wyświetlenia wyników w podziale na grupy.

Przykład, niech będzie o sieci jakiejś piekarni.

Handlowcy (handlowiecId) sprzedają w różnych punktach sprzedaży (punktId) rozmaite produkty (pozycjaId), np. chleb razowy, bułka wrocławska, kajzerka, rurka z kremem, tort, etc. To są pozycjeId. Kierownictwo może sobie pojedyncze pozycje grupować, np. grupa 'torty', 'słodycze', 'pieczywo białe', 'bułki'. To są grupaId. Pozycje moga wystepować w kilku grupach, np. kajzerka w grupie 'pieczywo białe' i 'bułki'.

Chcę, żeby w kostce pokazane było np.

Punkt Sprzedaży | NazwaGrupy     | ilość
Katowice | Pieczywo białe | 25
Katowice | Bułki | 20
Warszawa | Słodycze | 50


Próbowałem z:
- podłączaniem tabeli Grupowanie do tabeli Sprzedaż (po pozycjaId) oraz SlownikGrup do Grupowanie (po grupaId) - wiesza się przy rozwijaniu pozycji (może wina ilości kombinacji grupowania?)
- tworzeniem wymiarów pośrednich gdzie tabela Grupowanie była pośrednim, a SlownikGrup docelowym, ale się nie procesuje - zgłasza błedy w hierarchii atrybutów, ale przywzyczaiłem się że komunkaty nie zawsze sa miarodajne, to może więc nie o to chodzi.

Jak zrobić to, co mam na myśli? Moze trzeba zmienić strukturę tabel źródłowych? Możecie zasugerować jakieś rozwiązanie albo skierować do jakiejś lektury czy przykładu? Może ogólnie jest błąd logiczny, bo nie ma sensu sumować np. 'pieczywa białego' i 'bułek' w Katowicach i mechanizm się zapętla?

EDIT: Chyba sobie poradziłem. Tabela 'Grupowanie' posłużyła do utworzenia nowej grupy wymiarów, a następnie powiązałem SlownikGrup z nową grupą relacją many-to-many. Ale pytanie czy to dobrze - aktualne.Bartosz Ratajczyk edytował(a) ten post dnia 17.07.12 o godzinie 13:53
Grzegorz Stolecki

Grzegorz Stolecki konsultant Business
Intelligence, SQL
Server, MVP

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Jeśli w danych jest relacja wiele-do-wielu to inaczej tego zrobić się prawie nie da. Mówię prawie bo jest jeszcze coś co się nazywa kompresją relacji many-2-many. Polega to na utworzeniu zwykłego wymiaru, którego elementami są wszystkie występujące kombinacje id. Ale to się nadaje do zastosowań gdzie jest mało id i jeszcze mniej ich kombinacji.

Problem many-2-many jest z odbiorem wyników przez użytkowników - bo widzą coś takiego:

bułki: 20
pieczywo: 30
-
suma: 30

Od razu problem, bo widać przecież, że suma jest źle policzona :-)

pozdrawiam
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Dzięki. Poszukałem potem poczytałem trochę więcej i wychodzi, że many-to-many będzie w tym przypadku najlepszym rozwiązaniem.
Grzegorz Stolecki:
Problem many-2-many jest z odbiorem wyników przez użytkowników - bo widzą coś takiego:

bułki: 20
pieczywo: 30
-
suma: 30

Akurat o tym użytkownicy doskonale wiedzą i z tym problemu nie będzie. Już teraz tak analizują z poziomu bazy transakcyjnej.

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora
Grzegorz Stolecki

Grzegorz Stolecki konsultant Business
Intelligence, SQL
Server, MVP

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Nie o to chodzi.

Tu mamy przykład, gdzie fakt dotyczy sprzedaży jednego towaru, który jest klasyfikowany do kilku grup towarowych. Czyli jeden towar należy do wielu grup, jedna grupa zawiera wiele towarów. Stąd wiele-do-wielu.

Nie może to być hierarchia grupa-towar bo tutaj jeden towar należy tylko i wyłącznie do jednej grupy.
Nie mogą to być niezależne wymiary dowiązane do faktu bo w fakcie mamy tylko id towaru. Możemy dodać id grupy - ale znowu - tylko jednej w jednym wierszu.

Analysis Services ma mechanizm obsługi takiej relacji.

pozdrawiam
Grzegorz Stolecki

Grzegorz Stolecki konsultant Business
Intelligence, SQL
Server, MVP

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Co do czasu jako osobnych wymiarów Rok i Miesiąc - zgoda - w Excel można ustawiać je w dowolnej kolejności, bo Excel ma tą przyjemną cechę, że niezależnie od tego jakie wymiary/atrybuty ustawimy w osi tabeli zawsze dostępna jest funkcja rozwijania/zwijania jako drzewka hierarchicznego.
Niestety większość innych aplikacji klienckich jakie znam już takiej opcji nie posiada.

Tutaj niestety rolę zaczyna grać stara prawda: często budowa kostki musi być dostosowana do narzędzia w jakim ona będzie przeglądana.

pozdrawiam
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Dzięki za odpowiedzi. To kolejna rzecz: zanim zgrupujemy dane, musimy je pomnożyć przez dany współczynnik. Nasza tabela grupowanie wygląda więc tak:

Grupowanie
-------
grupaId (INT)
pozycjaId (INT)
wsp (INT)


Poradziłem sobie przez wprowadzenie formuły do wartości wyliczanej:

 [Measures].[ilość] * [Measures].[wsp] 


oraz ustawiając w grupie wymiarów 'Grupowanie' agregację 'wsp' na 'none'.

I działa, ale pojawia się problem gdybym chciał osadzić kostkę nie na bazie w edycji Enterprise, tylko na wersji Standard. Ta druga bowiem nie pozwala użyć ani miar wyliczanych w locie ani braku agregacji. Jak najwygodniej byłoby to obejść gdybym chciał wykorzystać edycję Standard?

Na szybko mi przychodzi trzymanie dodatkowo już przemnożonych danych w tabeli faktów (czy to na poziomie hurtowni, czy w locie jako widok) ale obawiam się rozdmuchania ilości wierszy.
Grzegorz Stolecki

Grzegorz Stolecki konsultant Business
Intelligence, SQL
Server, MVP

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Jak rozumiem wsp ma być widoczny w kostce, ale nie ma mieć wartości na wyższych poziomach grupowania?
Formuły są jak najbardziej dostępne w Standard. Nie są dostępne Measure Expressions, które są bezpośrednią właściwością miary. W Standard możesz bez problemu tworzyć elementy w skrypcie kalkulacyjnym kostki.
Nietypowe agregacje wybranych miar w wybranych częściach kostki załatwia się najwygodniej przez SCOPE w skrypcie kalkulacyjnym.
Akurat pomysł z pomnożeniem w hurtowni jest dobry. Wszystkie formuły zawarte w kostce są obliczane w momencie wykonywania zapytania - co powoduje nieznaczne wydłużenie czasu ich realizacji (albo znaczne - to w sumie zależy od stopnia komplikacji formuły). Do tego wyniki formuł są buforowane w ograniczonym zakresie.

pozdrawiam
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: [SSAS 2008] Kostka z wynikami opartymi o tabelę grupującą

Masz rację, miałem na myśli właśnie Measure Expressions.

wsp ma służyć do przemnożenia ilości z tabeli Sprzedaż, żeby pokazać wartość jaka ma być w grupie. Dodatkowo chciałbym bardziej dociekliwym pokazać skąd się wzięła dana liczba w grupie.

Przykład (dalej piekarnia).

Handlowiec X sprzedał 10 bułek. Handlowiec Y sprzedał 8 opakowań po 10 bułek. Chcemy wiedzieć ile tych bułek było razem. W tabelach:

Sprzedaz
--------
handlowiecId | punktId | pozycjaId | ilość | data
10 | 15 | 28 | 10 | 2012-07-01
34 | 15 | 34 | 8 | 2012-07-04

Grupowanie
----------
grupaId |pozycjaId |wsp
15 | 28 | 1
15 | 34 | 10
15 | 12 | -1
11 | 34 | 1

SlownikGrup
-----------
id | nazwa
15 | Sprzedaż bułek
11 | Sprzedaż opakowań bułek

SlownikPozycji
--------------
id | nazwa
28 | bułka
34 | opakowanie 10 bułek
12 | zwroty bułek


W wyniku mam:
NazwaGrupy              | IlośćWGrupie
Sprzedaż bułek | 90
Sprzedaż opakowań bułek | 8


Dodatkowo: dla bardziej dociekliwych chciałbym:
NazwaGrupy              | NazwaPozycji        | IlośćGr | IlosćPoz | Wsp
Sprzedaż bułek | bułka | 10 | 10 | 1
Sprzedaż bułek | opakowanie 10 bułek | 80 | 8 | 10
Sprzedaż opakowań bułek | opakowanie 10 bułek | 8 | 8 | 1

A mam
NazwaGrupy              | NazwaPozycji        | IlośćGr | IlosćPoz | Wsp
Sprzedaż bułek | bułka | 10 | 10 | 1
Sprzedaż bułek | opakowanie 10 bułek | 80 | 8 | 10
Sprzedaż bułek | zwroty bułek | | | -1
Sprzedaż opakowań bułek | opakowanie 10 bułek | 8 | 8 | 1


Jak obejść wyświetlanie wsp = -1? Ponieważ jest w grupie miar, to rzeczywiście będzie się pojawiał dla każdej grupy. A jak zrobić, żeby się nie pojawiał, jeśli nie mam żadnego wyniku z nim związanego?

EDIT: poprawione formatowaniaBartosz Ratajczyk edytował(a) ten post dnia 31.07.12 o godzinie 18:51

Następna dyskusja:

Windows Server 2008 - Quiz




Wyślij zaproszenie do