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.
"There is a theory which states that if ever anybody discovers exactly what the
Universe is for and why it is here, it will instantly disappear and be replaced by
something even more bizarre and inexplicable. There is another theory which states
that this has already happened."
-- Douglas Adams