[ nnele @ 18.05.2007. 13:55 ] @
Pozdrav,

Da li je uopste moguce u firebird-u napraviti crosstab upit kao u accessu? (transform i pivot)

Dakle, uprosceno, hocu da uradim sledece

tabela1

a 1 10
a 2 20
a 3 30
b 1 40
c 1 50
d 2 60


tabela2
1 aaaa
2 bbbb
3 cccc


a ja hocu da dobijem rezultat koji izgleda ovako:

aaaa bbbb cccc
a 10 20 30
b 40 null null
c 50 null null
d null 60 null


Nadam se da sam bio jasan..;)


Pozdrav,
nele
[ schild @ 21.05.2007. 08:45 ] @
Nemože to u FB.


[ Fikret @ 21.05.2007. 10:35 ] @
Moze se izvesti, ali ce biti uzasno sporo. BTW, mislim da to samo access podrzava u obliku koji tebi treba...

Pogledaj FB 2.1 i COMMON TABLE EXPRESSIONS, to je vec druga prica ;-)

WITH
DEPT_YEAR_BUDGET AS (
SELECT FISCAL_YEAR, DEPT_NO, SUM(PROJECTED_BUDGET) AS BUDGET
FROM PROJ_DEPT_BUDGET
GROUP BY FISCAL_YEAR, DEPT_NO
)
SELECT D.DEPT_NO, D.DEPARTMENT,
B_1993.BUDGET AS B_1993, B_1994.BUDGET AS B_1994,
B_1995.BUDGET AS B_1995, B_1996.BUDGET AS B_1996
FROM DEPARTMENT D
LEFT JOIN DEPT_YEAR_BUDGET B_1993
ON D.DEPT_NO = B_1993.DEPT_NO AND B_1993.FISCAL_YEAR = 1993
LEFT JOIN DEPT_YEAR_BUDGET B_1994
ON D.DEPT_NO = B_1994.DEPT_NO AND B_1994.FISCAL_YEAR = 1994
LEFT JOIN DEPT_YEAR_BUDGET B_1995
ON D.DEPT_NO = B_1995.DEPT_NO AND B_1995.FISCAL_YEAR = 1995
LEFT JOIN DEPT_YEAR_BUDGET B_1996
ON D.DEPT_NO = B_1996.DEPT_NO AND B_1996.FISCAL_YEAR = 1996

WHERE EXISTS (SELECT * FROM PROJ_DEPT_BUDGET B WHERE D.DEPT_NO = B.DEPT_NO)

Dobices nesto ovako:




Ovo je standardna employee.fdb baza.

Fb 2.1 je trenutno u beta-fazi, i ocekuje se za par mjeseci...
[ nnele @ 24.05.2007. 13:08 ] @
Znaci da cekam sledecu verziju firebird-a...


Hvala na odgovorima
[ Fikret @ 25.05.2007. 09:35 ] @
Pa vec sada mozes koristiti FB 2.1 ;-)
Dok aplikacija bude gotova, bice i release FB 2.1 ;-)
[ nnele @ 18.06.2007. 09:31 ] @
Sada sam konacno stigao malo detaljnije da pogledam ovaj upit i tu je mali problem sto su kolone fiksirane u upitu a ne kreiraju se dinamicki zavisno od toga sta se nalazi u bazi. Dakle moram unapred da znam koje kolone ce da se pojave i da ih u startu ubacim u upit tako da mi ova varijanta bas i ne odgovara.
Moracu da na neki drugi nacin simuliram ovakav upit.

Hvala jos jednom.


Pozdrav,
nele
[ rambo @ 28.06.2007. 02:24 ] @
Posle malo eksperimentisanja, došao sam do sledećeg:

Trenutno nemam jednostavno rešenje za ovakav problem, tj. ne znam dali (i kako) ovo može da se reši jednostavnim SELECT upitom. To i dalje ne znači da ovo nije moguće rešiti jednostavnije nego što ću u nastavku izložiti.

Pošto ja koristim Delphi kao IDE, mogu ti ponuditi rešenje jedino pomoću njega. Jedno malo nestandardno rešenje do kojeg sam došao jeste da se iskoristi neka PIVOT GRID komponenta, pa tako, ja sam probao sa DevExpress ExpressPivotGrid. Ova komponenta ti omogućava da iz jednostavnog SELECT-a dobiješ vrlo složene analize, pa tako i cross-tab pogled na podatke. Sledeći tvoje specifikacije, napravio sam sledeće dve tabele:

Code:

CREATE TABLE GRUPE (
  GRUPA_ID INTEGER NOT NULL,
  NAZIV VARCHAR(20) NOT NULL,
  CONSTRAINT PK_GRUPE PRIMARY KEY (GRUPA_ID)
);

CREATE TABLE MESTA (
  MESTO_ID VARCHAR(3) NOT NULL,
  GRUPA_ID INTEGER NOT NULL,
  BROJ INTEGER NOT NULL,
  CONSTRAINT PK_MESTA PRIMARY KEY (MESTO_ID, GRUPA_ID),
  CONSTRAINT FK1_GRUPA_ID FOREIGN KEY (GRUPA_ID) REFERENCES GRUPE(GRUPA_ID) ON DELETE NO ACTION ON UPDATE CASCADE
);

Važno je da kažem da je ovde tabela GRUPE tvoja TABELA2 i tabela MESTA tvoja TABELA1 Tabele sam popunio tačno onim podacima koje si ti naveo u svom primeru.

Upit koji se koristi da bi se dobio traženi izlaz je sledeći:

Code:

SELECT M.MESTO_ID, G.NAZIV, M.BROJ
  FROM MESTA M
    INNER JOIN GRUPE G ON G.GRUPA_ID = M.GRUPA_ID

Zatim sam u PIVOT GRID-u dobijena polja rasporedio na sledeći način:

• Row fields: MESTO_ID
• Column fields: NAZIV
• Data fields: BROJ

i na kraju dobio tačno ono što tebi treba.

Predpostavljam da će komentari biti da ovo nije rešenje, pa zato ću da dodam i sledeće.

Mnoge kompleksne probleme ovog tipa rešavao sam pomoću STORED PROCEDURA jer tamo mogu da kontrolišem tok i vrstu ispisa koji vraćam. Obzirom da se ovde radi o izlazu koji je dinamičkog tipa, tj. broj kolona je promenljiv, onda kao (neprovereno) alternativno rešenje mogu da predložim da se napravi procedura koja kreira tabelu onako kako ti odgovara u svakom slučaju. Ovo bi moglo da se reši sa EXECUTE STATEMENT iskazom. Zatim se ta tabela popuni sa željenim podacima i eto rezultata.

Probaću ovih dana da napravim neko bolje rešenje, pa ako uspem, javljam.
[ nnele @ 09.07.2007. 10:10 ] @
U sustini ovo je bas ono sto meni treba:)

A sada sledi jedno glupo pitanje..;)

sta je pivot grid?

To je predpostavljam neke komponenta pa mi kazite gde to moze da se download-uje. takodje predpostavljam da moze da sadrzi vise Column fields

Hvala i pozdrav,
nele
[ obucina @ 16.07.2007. 23:53 ] @
Treba da mozes da koristis DecisionCube iz Delphi-ja za ovo.