Jak wykonać sumowanie wartości z dwóch kwerend?

1

Witam!
Zrobiłem sobie prosty programik do notatek i rozliczania zleceń w serwisie komputerowym. Dla każdego zlecenia wpisuję cenę za usługę ale tylko 30% jest dla mnie, to liczy pierwsza z kwerend:


SELECT Sum(Tserwis.Cena*0.30)  AS SumOfcena30, Tserwis.Rozliczony, Tserwis.pelna_stawka
FROM Tserwis
GROUP BY Tserwis.rozliczony, Tserwis.pelna_stawka,
HAVING  (Tserwis.Rozliczony=True) AND  (Tserwis.pelna_stawka=False);

Wyjątkiem są pewne zlecenia dla których przysługuje mi stawka 100%, to liczy druga kwerenda:


SELECT Sum(Tserwis.Cena)  AS SumOfPelnaStawka, Tserwis.Rozliczony, Tserwis.pelna_stawka
FROM Tserwis
GROUP BY Tserwis.rozliczony, Tserwis.pelna_stawka,
HAVING  (Tserwis.Rozliczony=True) AND  (Tserwis.pelna_stawka=True);

Oba zapytania zwracają wyniki. Czy da się je zrealizować w jednej kwerendzie tak aby jej wynikiem była suma wyników powyższych kwerend?

Pozdrawiam!

0

Jedna opcja to stworzenie tabeli tymczasowej. Takiej, ktora zostanie utworzona tylko na potrzeby Twojego zapytania, tylko w Twojej sesji. Mozesz w niej umiescic wyniki dwoch zapytan, a nastepnie je sumowac.

Druga opcja to unie. Czyli:

SELECT * FROM ((
SELECT * FROM table1 
WHERE 
) UNION ( 
SELECT * FROM table2 
WHERE ...
)) as t
WHERE ...
ORDER BY 

Tak na szybko, pisane z palca (pierwsze co przychodzi mi do glowy ;))

0
SELECT Sum(Case When pelna_stawka=False Then Cena*0.30 Else Cena End)  AS SumOfCena, Tserwis.Rozliczony, Tserwis.pelna_stawka
FROM Tserwis
WHERE (Tserwis.Rozliczony=True) 
GROUP BY Tserwis.rozliczony, Tserwis.pelna_stawka;

Czemu HAVING??

0

Misiekd Polska
4programmers.net 21.12.2010

                                                  PROŚBA

Zwracam się z uprzejmą prośbą do użytkownika HotIce oraz całej społeczności programistów
o nie używanie w swoich programach nazw zmiennych/stałych/procedur/funkcji/tabel/pól/widoków/...
w stylu "SumOfcena30" i podobnych ponglish'owych nazw. Czy tak trudno trzymać się obranej
konwencji? Jeśli nazywamy po polsku to niech będzie "SumaCen30", jeśli po angielsku to np.
"SumOfPrice30"

0

Dziekuje za odpowiedzi. Z uniami jeszcze nie próbowałem. Sprawdziłem sposób kolegi Marcin.Miga i jestem zaskoczony że w sql można stosować takie instrukcje warunkowe, zresztą moja znajomość sql jest raczej podstawowa... W każdym razie przy próbie wykonania tego zapytania MS Access wypluwa błąd "Błąd skladniowy(brak operatora) w wyrażeniu kwerendy itd......". W czym problem? Czyżby silnik baz danych Access nie obsługuje instrukcji typu WHEN, CASE, ELSE ? a może rzeczywiście jest bląd składniowy?

0

Access faktycznie nie wspiera CASE. Ma swój SQL - Jet SQL. Zresztą każdy SZBD ma nieco odmienny SQL. Faktem jest, że domyśliłem się, że to Access (właśnie po owym niesławnym SumOfCena30 :) ), ale nie skojarzyłem braku CASE. Zastąp to IIfem. Czyli coś takiego (nie widzę całego SQL-a): Sum(Iif(pelna_stawka,cena,cena*0.3))

pozdrawiaMM

0

Właściwie ta kwerenda ma być użyta w programie napisanym w Delpih w połączeniu z bazą accessa ale testuję ją w accessie bo mi wygodniej.
Ta instrukcja też mnie zaskoczyła:)

Sum(Iif(pelna_stawka,cena,cena*0.3))

Nie wiem jak ona działa podejrzewam że Iif(warunek(prawda/fałsz), wykonać jeżeli prawda, wykonać jeżeli fałsz)
Po uruchomieniu wyświetla dwa rekordy ze stawkami ale nie są zsumowane tylko oddzielnie...

W pełnej postaci wygląda teraz tak:

SELECT Sum(Iif(pelna_stawka,cena,cena*0.3))  AS SumOfCena, Tserwis.Rozliczony, Tserwis.pelna_stawka
FROM Tserwis
WHERE (Tserwis.Rozliczony=TRUE) 
GROUP BY Tserwis.rozliczony, Tserwis.pelna_stawka;

pozdrawiam!

0

Tyle, że teraz nie potrzebujesz już informacji czy to pełna stawka, czy też nie. Dlatego masz dwa rekordy - jeden z 30%, a jeden z pełnej stawki. Tym się te rekordy różnią. Wywal tserwis.pelna_stawka z listy pól i grupowania a będzie git.

0
Marcin.Miga napisał(a)

Tyle, że teraz nie potrzebujesz już informacji czy to pełna stawka, czy też nie. Dlatego masz dwa rekordy - jeden z 30%, a jeden z pełnej stawki. Tym się te rekordy różnią. Wywal tserwis.pelna_stawka z listy pól i grupowania a będzie git.

Działa jak trzeba! ale tylko w MS Access,kiedy podam to we właściwości SQL komponentu TADOQuery to po wykonaniu na raporcie skojarzony komponent TQRDBText nie wyświetla wyniku, jest pusto. Nie wiem dlaczego. Może winny jest sterownik do Accessa?. Używam Delphi 7.

tak mam ustawiony "ConnectionString" do bazy:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\serwis\baza\serwis.mdb;Persist Security Info=False

Kwerenda w tej chwili wygląda tak:

SELECT Sum(Iif(pelna_stawka,cena,cena*0.3))  AS SumOfCena, Tserwis.Rozliczony
FROM Tserwis
WHERE (Tserwis.Rozliczony=TRUE) 
GROUP BY Tserwis.rozliczony;
0

Tu ci nie pomogę. W delphim to jakieś 12 lat juz nie piszę. Ale spróbuj nie przez komponenty, tylko normalnie przez ADO w Delphim. Wtedy ci jakimś błędem wywali. I wypróbuj obie wersje (z IIF i CASE)

0

Kolego Marcinie dziękuję za fachową poradę, już mi działa dobrze, we włściwości labela trzeba było ustawić właściwość "data field" na zmienną utworzoną podczas generowania wyniku kwerendy np. jeżeli byłoby ....AS SumaCeny.... to trzeba ustawić na "SumaCeny" i wtedy wyświetla się wynik na etykiecie. Jeszcze raz dziękuję za pomoc.

Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1