Po wnikliwej 'analizie' roznych archiwow wyszlo mi, ze MSSQL nie ma
Akcesowego odpowiednika kwerendy krzyzowej.
W zwiazku z tym ciekawi mnie bardzo jak to mozliwe, ze tak uzyteczna rzecz
jest w 'malym' Akcesie, a nie ma jej w 'duzym' MS SQL?
Ewentualnosci:
-zapomnieli?
-nie chcialo im sie?
-sfrustrowany projektant podlozyl swinie?
-inne przyczyny?
Pozdrawiam
Piglet
a o co chodzi w tej kwerendzie krzyzowej? mozesz to przetlumaczyc
na jezyk sqlowcow? podejrzewam ze chodzi o jakiegos cross joina,
ale tylko podejrzewam. po prostu unikam jak ognia technicznej terminologii
spolszczonej przez microsoft, bo ciezko zgadnac o co im tak naprawde chodzi.
znik.
|Po wnikliwej 'analizie' roznych archiwow wyszlo mi, ze MSSQL nie ma
|Akcesowego odpowiednika kwerendy krzyzowej.
|
|W zwiazku z tym ciekawi mnie bardzo jak to mozliwe, ze tak
|uzyteczna rzecz
|jest w 'malym' Akcesie, a nie ma jej w 'duzym' MS SQL?
|
|Ewentualnosci:
|-zapomnieli?
|-nie chcialo im sie?
|-sfrustrowany projektant podlozyl swinie?
|-inne przyczyny?
|
Mnie rowniez to gnebilo. Pewnie w MS nie wpadli na pomysl jak sprawnie takie zapytanie obsluzyc. Nieumiejetnie uzyty cross, na duzej tabeli, moze polozyc baze. Z drugiej jednak strony crossy sa we wszystkich powaznych narzedziach raportujacych i jesli juz ktos robi raport oparty o crossa to nie wrzuca do niego duzej ilosci rekordow, takze nie istnieje ryzyko wylozenia bazy przez zapytanie z raportu.
Pozdrawiam, Marcin.
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych
Cross-Tab reports
Moim zdaniem skupili się bardziej na module analitycznym (Analysis
Services),
gdzie takie zapytania są na porządku dziennym, dodatkowo wspomagane
przez tabele przestawne, wyrażenia MDX, itd.
Chyba brakło czasu...
Ale jest nadzieja. Nowa wersja MSSQL-a ma oferować takie możliwości.
Polecam:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsql90/html/sql_ovyukondev.asp
Należy szukać: PIVOT and UNPIVOT operators
Pozdrawiam
Waldek
Dnia 25 marca 2004 w pewnym liście napisane było:
> Witam,
Dodali za to OLAP'a. Zapewne z powodów politycznych lub
wydajnościowych.
Ale jeżeli chcesz to jest na to metoda:
==============================================
CREATE PROC dbo.rp_PivotTableSimple
@Table VARCHAR(255),
@RowFld VARCHAR(255),
@ColFld VARCHAR(255),
@ValFld VARCHAR(255),
@Filter VARCHAR(255),
@AggFunct VARCHAR(255)
AS
BEGIN
DECLARE @SQL AS VARCHAR(8000)
DECLARE @CursorSQL AS VARCHAR(8000)
DECLARE @ColVal AS VARCHAR(1024)
DECLARE @NewCol AS VARCHAR(2048)
/* get col hdrs */
SET @CursorSQL = 'DECLARE FldCursor CURSOR FAST_FORWARD FOR '
+ 'SELECT ' + @ColFld + ' FROM ' + @Table + ' GROUP BY '
+ @ColFld + ' ORDER BY ' + @ColFld
EXEC( @CursorSQL )
OPEN FldCursor
/* traverse col hdrs, generating SQL for table */
SET @SQL = 'SELECT ' + @RowFld
FETCH NEXT FROM FldCursor INTO @ColVal
WHILE @@FETCH_STATUS = 0
BEGIN
IF @ColVal IS NULL
--Print 'puste'
SET @NewCol = ', ' + @AggFunct + '(CASE WHEN ' + @ColFld + ' IS NULL THEN ' + @ValFld + ' ELSE NULL END) AS [NULL]'
ELSE
SET @NewCol = ', ' + @AggFunct + '(CASE ' + @ColFld + ' WHEN ''' + @ColVal + ''' THEN ' + @ValFld + ' ELSE NULL END) AS [' + @ColVal + ']'
SET @SQL = @SQL + @NewCol
FETCH NEXT FROM FldCursor INTO @ColVal
END
CLOSE FldCursor
DEALLOCATE FldCursor
/* finish SQL */
SET @SQL = @SQL + ' FROM ' + @Table
IF 0 < LEN( @Filter)
SET @SQL = @SQL + ' WHERE ' + @Filter
SET @SQL = @SQL + ' GROUP BY ' + @RowFld + ' ORDER BY ' + @RowFld
/* run it! */
-- PRINT @SQL
EXEC (@SQL)
END
================================
Używa się tego o tak:
Exec rp_PivotTableSimple
@Table = 'Tabela',
@RowFld = 'Miesiac',
@ColFld = 'TypKlienta',
@ValFld = 'WartoscSprzedazy',
@Filter = '',
@AggFunct = 'sum'
--
Pozdrawiam RAdek
hasło na dziś:
Wyjątki z opisów wypadków: Wracając do domu wjechałem do złego domu i zderzyłem się z drzewem, którego nie mam...
> > Po wnikliwej 'analizie' roznych archiwow wyszlo mi, ze MSSQL nie ma
> > Akcesowego odpowiednika kwerendy krzyzowej.
> ...
Po pierwsze kwerenda krzyżowa to wynalazek Access-a, w standardzie SQL
jej nie ma. Po drugie: polecam eksperyment polegający na zamianie w Accessie
typu kwerendy z krzyżowej na zwykłą wybierającą - zmieni się tylko spospób
prezentacji wyników kwerendy, natomiast informacje w tym zbiorze zawarte będą
takie sam - więc po co stosować coś co tylko i wyłącznie zmiania wygląd
zbioru wyników?
Nie tylko MSSQL nie ma kwerendy krzyżowej, inne "duże" bazy danych też jej
nie mają, w końcu to zwykła kwerenda wybierająca wykorzystująca grupowanie
i funkcje agregujące...
W ogóle nazwa jest myląca bo sugeruje coś całkiem innego (technika
charakterystyczna dla Accessa), w końcu crosstab sugeruje jakiś związek z
cross join (a to całkiem dwie różne rzeczy).
Sławek
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
|From: [mailto:slawomir.sw...@NOSPAM.gazeta.pl]
|
|Po pierwsze kwerenda krzyżowa to wynalazek Access-a, w standardzie SQL
|jej nie ma. Po drugie: polecam eksperyment polegający na
|zamianie w Accessie
|typu kwerendy z krzyżowej na zwykłą wybierającą - zmieni się
|tylko spospób
|prezentacji wyników kwerendy, natomiast informacje w tym
|zbiorze zawarte będą
|takie sam - więc po co stosować coś co tylko i wyłącznie
|zmiania wygląd
|zbioru wyników?
|
|Nie tylko MSSQL nie ma kwerendy krzyżowej, inne "duże" bazy
|danych też jej
|nie mają, w końcu to zwykła kwerenda wybierająca
|wykorzystująca grupowanie
|i funkcje agregujące...
|
Wydaje mi sie, ze troche sie mylisz. Tu nie chodzi tylko o zmiane wygladu zbioru wynikow. Na ogol jesli robi sie kwerende krzyzowa (czy jak tam zwal pivota) to zwykle dane ulegaja agregacji, czyli gubimy pierwotna informacje (jednostkowe informacje) i z samego takiego pivota nie mozna zrobic nic oprocz "ogladania" go :)
Ktos wspomnial, ze Microsoft w nowej wersji MSSQL szykuje instrukcje pivot i unpivot. Ciekawi mie w szczegolnosci ta druga, w kontekcie faktu, ze samego pivota z agregatami nie da sie odwrocic do postaci pierwotnej! Ale z drugiej strony wiemy, ze MS potrafi czynic cuda ;)
Dnia 25 marca 2004 w pewnym liście napisane było:
> Po pierwsze kwerenda krzyżowa to wynalazek Access-a, w standardzie SQL
> jej nie ma. Po drugie: polecam eksperyment polegający na zamianie w Accessie
> typu kwerendy z krzyżowej na zwykłą wybierającą - zmieni się tylko spospób
> prezentacji wyników kwerendy, natomiast informacje w tym zbiorze zawarte będą
> takie sam - więc po co stosować coś co tylko i wyłącznie zmiania wygląd
> zbioru wyników?
> Nie tylko MSSQL nie ma kwerendy krzyżowej, inne "duże" bazy danych też jej
> nie mają, w końcu to zwykła kwerenda wybierająca wykorzystująca grupowanie
> i funkcje agregujące...
I ma dynamiczną liczbę kolumn, ale to szczegół :)
--
Pozdrawiam RAdek
hasło na dziś:
Przysłowia polskie: Kto pod kim dołki kopie, ten szybko awansuje.
> Wydaje mi sie, ze troche sie mylisz. Tu nie chodzi tylko o zmiane wygladu
zbioru wynikow. Na ogol jesli robi sie kwerende krzyzowa (czy jak tam zwal
pivota) to zwykle dane ulegaja agregacji, czyli gubimy pierwotna informacje
(jednostkowe informacje) i z samego takiego pivota nie mozna zrobic nic
oprocz "ogladania" go :)
Przecież dokładnie jest tak samo jeżeli robisz zwykłego selecta z
grupowaniem i agregowaniem. Informacja pierwotna też jest gubiona.
> Ktos wspomnial, ze Microsoft w nowej wersji MSSQL szykuje instrukcje pivot
i unpivot. Ciekawi mie w szczegolnosci ta druga, w kontekcie faktu, ze
samego pivota z agregatami nie da sie odwrocic do postaci pierwotnej! Ale z
drugiej strony wiemy, ze MS potrafi czynic cuda ;)
Skoro "pivot" to będzie przeniesienie zgrupowanych wierszy jako kolumny, to
"unpivot" pewnie będzie przeniesieniem kolumn do wierszy. Żadne cuda.
Oczywiście "ungroup-owania" takich wierszy nikt nie zrobi :-)
RM
> Wydaje mi sie, ze troche sie mylisz. Tu nie chodzi tylko o zmiane
> wygladu zbioru wynikow. ...
Ok nie warto o się sprzeczać:), w swojej odpowiedzi miałem głównie na myśli,
że bez kwerend krzyżowych da się żyć, choć zgadzam się, że w raportach
bywają użyteczne.
Co do utraty informacji, ta sama sytuacja ma miejsce w przypadku kwerend
wybierających z funkcjami agregującymi i grupowaniem;) (no dobra - bardzo
podobna), w końcu obie techniki pozwalają uzyskać odpowiedź na zadane
pytanie, jest tylko kwestia sposobu w jaki tę odpowiedź możemy "przeczytać".
Pozdrawiam Sławek
> jej nie ma. Po drugie: polecam eksperyment polegający na zamianie w
Accessie
> typu kwerendy z krzyżowej na zwykłą wybierającą - zmieni się tylko spospób
> prezentacji wyników kwerendy, natomiast informacje w tym zbiorze zawarte
będą
> takie sam - więc po co stosować coś co tylko i wyłącznie zmiania wygląd
> zbioru wyników?
[...]
Bo takiego sposobu prezentacji chcą użytkownicy.
>
> Nie tylko MSSQL nie ma kwerendy krzyżowej, inne "duże" bazy danych też jej
> nie mają, w końcu to zwykła kwerenda wybierająca wykorzystująca grupowanie
> i funkcje agregujące...
[...]
To, że tego typu kwerend nie mają inne bazy nie zmniejsza jej przydatności.
Niezwykłość kwerendy krzyżowej polega na dynamicznej liczbie kolumn.
Pozdrawiam
--
Grzegorz Gruza
gruza@spamerom_niepriv4.onet.pl
Odpowiadając usuń spamerom_nie z adresu
jesli masz taka mozliwosc proponuje zajrzec do ksiazki
"SQL Server Programming Unlished"
jest tam zamieszczony kod sqla procedury skladowanej
wykonujacej kwerendy krzyzowe
R@F