Obliczenia z kilku tabel w kwerendzie

Użytkowanie programu bazodanowego
lepik
Posty: 5
Rejestracja: pn cze 29, 2009 9:21 pm

Obliczenia z kilku tabel w kwerendzie

Post autor: lepik »

Witam
W bazie są 3 tabele: towary, zakupy i sprzedaz. Są one połączone (jest relacja kluczami) polem towar. Chodzi o wykonanie kwerendy, która by pokazywała aktualny stan towarów (różnicę między zakupem a sprzedażą). Dane do tabel Zakupy i Sprzedaz są wprowadzane przy pomocy oddzielnych formularzy.
Schemat tabel (---------- --> relacja między tabelami)

Zakupy Towary Sprzedaz
ID_z (klucz) ID_s(klucz)
towar----------towar(klucz)--------towar
ilosc_z ilosc_s
data_z data_s

Przepraszam, że schemat nie wygląda zbyt czytelnie jasno
jkwin
Posty: 28
Rejestracja: pt cze 12, 2009 5:57 pm

Re: Obliczenia z kilku tabel w kwerendzie

Post autor: jkwin »

Spróbuj:
SELECT "TOWARY"."TOWAR", "ILOSC_Z" - "ILOSC_S" AS "STAN" FROM "SPRZEDAZ", "TOWARY", "ZAKUPY" WHERE "SPRZEDAZ"."ID_T" = "TOWARY"."ID_T" AND "ZAKUPY"."ID_T" = "TOWARY"."ID_T"
lepik
Posty: 5
Rejestracja: pn cze 29, 2009 9:21 pm

Re: Obliczenia z kilku tabel w kwerendzie

Post autor: lepik »

Spróbuj:
SELECT "TOWARY"."TOWAR", "ILOSC_Z" - "ILOSC_S" AS "STAN" FROM "SPRZEDAZ", "TOWARY", "ZAKUPY" WHERE "SPRZEDAZ"."ID_T" = "TOWARY"."ID_T" AND "ZAKUPY"."ID_T" = "TOWARY"."ID_T"
Też wydawało mi się to takie proste, ale przy takim zapisie źle liczy. Proszę spojrzeć do załączonego pliku.
Załączniki
stan.odb
(7.65 KiB) Pobrany 293 razy
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Obliczenia z kilku tabel w kwerendzie

Post autor: mg2 »

Też wydawało mi się to takie proste, ale przy takim zapisie źle liczy.
Źle liczy bo nie sortuje towaru.

(+ zał.)

Kwerenda sum zakupów:

Kod: Zaznacz cały

SELECT "towar" AS "t_z",
SUM( "ilosc_z" ) AS "ilosc_z_sum"
FROM "zakupy"
GROUP BY "towar"
Kwerenda sum sprzedaży:

Kod: Zaznacz cały

SELECT "towar" AS "t_s",
SUM( "ilosc_s" ) AS "ilosc_s_sum"
FROM "sprzedaz"
GROUP BY "towar"
Stan magazynu:

Kod: Zaznacz cały

SELECT "kw_zakupy_sum"."t_z",
"kw_zakupy_sum"."ilosc_z_sum" AS "il_z_sum",
ifnull( "kw_sprzedaz_sum"."ilosc_s_sum", 0 ) AS "il_s_sum",
"kw_zakupy_sum"."ilosc_z_sum" - ifnull( "kw_sprzedaz_sum"."ilosc_s_sum", 0 ) AS "stan"
FROM "kw_zakupy_sum" LEFT OUTER JOIN "kw_sprzedaz_sum"
ON "kw_zakupy_sum"."t_z" = "kw_sprzedaz_sum"."t_s"
UWAGI TECHNICZNE
Baza dopuszcza możliwość sprzedaży towaru, który nie został zakupiony !
Towar "atrament" jest w tabeli "towary" i w tabeli "sprzedaz" ale nie ma go w tabeli "zakupy".
Bezpieczniej jest zrobić bazę bez takiego założenia tak, żeby w tabeli "stan magazynu" pokazywały się wartości ujemne.
Można to zrobić przez "FULL JOIN" zamiast "LEFT JOIN". Problem w tym, że OOo (v. 3.2.0) nie obsługuje tego polecenia. W przypadku dwóch tabel można je w miarę sensownie zastąpić przez "[LEFT JOIN] UNION [RIGHT JOIN]". Jednak "UNION" trzeba wpisać jako polecenie SQL (nie kwerendę) co wymusza użycie "CREATE VIEW" (również jako polecenie SQL). Dopiero z tak powstałego widoku (niewidocznego w interfejsie bazy do ponownego otwarcia pliku) można utworzyć kwerendę.

PS

Odpowiednikiem polecenia "CREATE VIEW" jest przycisk "Utwórz widok ..." w dziale tabel. Tak utworzony widok jest widoczny od razu (nie trzeba ponownie otwierać pliku). Widok można modyfikować jako polecenie poprzez "Edytuj w widoku SQL ...".
Załączniki
stan_magazynu.odb
(6.89 KiB) Pobrany 340 razy
OOo3.1.1 na Ubuntu 9.04
ODPOWIEDZ