Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[MSSQL] Kwerenda krzyzowa

376 views
Skip to first unread message

Piglet

unread,
Mar 25, 2004, 5:27:50 AM3/25/04
to
Witam,

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


Grzegorz Szyszlo

unread,
Mar 25, 2004, 6:12:59 AM3/25/04
to
Piglet wrote:
> Witam,
>
> Po wnikliwej 'analizie' roznych archiwow wyszlo mi, ze MSSQL nie ma
> Akcesowego odpowiednika kwerendy krzyzowej.

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.

Bojanowski Marcin

unread,
Mar 25, 2004, 6:10:48 AM3/25/04
to

|From: Piglet [mailto:pig...@box44.gnet.pl]

|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

Piglet

unread,
Mar 25, 2004, 6:30:55 AM3/25/04
to

>
> 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.
>

Cross-Tab reports


Waldemar Gil

unread,
Mar 25, 2004, 6:33:58 AM3/25/04
to

Użytkownik "Piglet" <pig...@box44.gnet.pl> napisał w wiadomości
news:c3uc82$3co$1...@atlantis.news.tpi.pl...

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


RAdek

unread,
Mar 25, 2004, 8:08:28 AM3/25/04
to
CZeść

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...

slawomir.sw...@nospam.gazeta.pl

unread,
Mar 25, 2004, 8:28:22 AM3/25/04
to
Grzegorz Szyszlo <zn...@wbc.lublin.pl> napisał(a):


> > 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/

Bojanowski Marcin

unread,
Mar 25, 2004, 9:25:50 AM3/25/04
to

|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 ;)

RAdek

unread,
Mar 25, 2004, 9:36:13 AM3/25/04
to
CZeść

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.

RM

unread,
Mar 25, 2004, 10:10:03 AM3/25/04
to
Użytkownik "Bojanowski Marcin" <Marcin.B...@mofnet.gov.pl> napisał w
wiadomości
news:E036A9602106824FBC22...@min-xch-1.min.mofnet.gov.pl...

> 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


slawomir.sw...@nospam.gazeta.pl

unread,
Mar 25, 2004, 10:57:16 AM3/25/04
to
Marcin.B...@mofnet.gov.pl (Bojanowski Marcin) napisał(a):

> 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

Grzegorz Gruza

unread,
Mar 25, 2004, 11:56:30 AM3/25/04
to
Użytkownik <slawomir.sw...@NOSPAM.gazeta.pl> napisał w wiadomości
news:c3umpm$q4g$1...@inews.gazeta.pl...
> Grzegorz Szyszlo <zn...@wbc.lublin.pl> napisał(a):
[...]

> Po pierwsze kwerenda krzyżowa to wynalazek Access-a, w standardzie SQL
[...]
Faktem jest, iż jest to bardzo przydatny wynalazek

> 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


R@F

unread,
Mar 26, 2004, 9:34:19 AM3/26/04
to
Użytkownik "Piglet" <pig...@box44.gnet.pl> napisał w wiadomości
news:c3uc82$3co$1...@atlantis.news.tpi.pl...
> Witam,
>
> Po wnikliwej 'analizie' roznych archiwow wyszlo mi, ze MSSQL nie ma
> Akcesowego odpowiednika kwerendy krzyzowej.
>

jesli masz taka mozliwosc proponuje zajrzec do ksiazki
"SQL Server Programming Unlished"
jest tam zamieszczony kod sqla procedury skladowanej
wykonujacej kwerendy krzyzowe

R@F


0 new messages