Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sumowanie elementów z różnych tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
myschool
Witam
Mam utworzone tabele (posiadające ten sam klucz id_pracownika) wypełnione danymi:

"Pracownicy" z kolumnami m.in "id_pracownika","imie","nazwisko"
"godziny" z kolumnami "id_pracownika","data","ilosc_godzin"
"nadgodziny" z kolumnami "id_pracownika","data","ilosc_nadgodzin"
"premie" z kolumnami "id_pracownika","data","wynagrodzenie"

Muszę utworzyć zapytanie, które podaje całkowite zarobki każdego pracownika (wyświetla: imie nazwisko zarobki) wliczając w to premie i nadgodziny za okres rozliczeniowy (np 2014-11-01 - 2014-11-30). Drugim zapytaniem jest wypisanie ilości nadgodzin konkretnego pracownika w konkretnym okresie czasu (2014-01-01 - 2014-12-31)
Zatem całomiesięczny zarobek będzie wynosił (20*suma(ilosc_godzin)+30*sum(ilosc_nadgodzin)+sum(wynagrodzenie)).

Proszę o pomoc.

Szymciosek
Poczytaj o relacjach w MySQL.

Dodam, że przyda Ci się tutaj wykorzystanie np. LEFT JOIN

select pracownicy.imie, godziny.ilosc_godzin from pracownicy left join godziny on pracownicy.id_pracownika = godziny.id_pracownika........
phpion
Cytat(Szymciosek @ 8.01.2015, 23:23:47 ) *
Dodam, że przyda Ci się tutaj wykorzystanie np. LEFT JOIN

Raczej nie będzie to najlepsze wyjście bo w efekcie dostaniesz masę zdublowanych wierszy, więc uzyskanie właściwych wartości będzie kłopotliwe. Lepszym rozwiązaniem będzie skorzystanie z UNION w celu pobrania danych z kilku tabel do jednego zbioru wynikowego. Potem na takich danych możesz zrobić SUM (wówczas zapytania z UNION jako podzapytanie), czy filtrować po datach. Możesz również uprościć sobie zapytania tworząc widok zwracający dane z UNION.
myschool
Wcześniej i później próbowałem na różne sposoby, niestety jestem zielony w MySQL, a ostatni kod jaki próbowałem to:

Cytat
Select id_pracownika,imie,nazwisko,
(
(SELECT 25*sum(ilosc_godzin) FROM godziny WHERE data >="2014-11-01" AND data <="2014-11-30" AND id_pracownika.godziny=id_pracownika.Pracownicy)
+
(SELECT 30*sum(ilosc_nadgodzin) FROM nadgodziny WHERE data >="2014-11-01" AND data <="2014-11-30" AND id_pracownika.nadgodziny=id_pracownika.Pracownicy)
+
(SELECT sum(wynagrodzenie) FROM premie WHERE data >="2014-11-01" AND data <="2014-11-30" AND id_pracownika.premie=id_pracownika.Pracownicy)

)AS suma

FROM Pracownicy LEFT JOIN Pracownicy;


Oczywiście to jest źle, ale siedzę nad tym bezproduktywnie, ktoś mógłby naprowadzić?

Kod - nie uwzględniając dat, ale całą bazę danych - składającą się z dwóch miesięcy

CODE
Select a.imie,a.nazwisko,sum(b.ilosc_godzin) Ilosc_godzin,sum(c.ilosc_nadgodzin) Ilosc_nadgodzin, sum(d.wynagrodzenie) Premie, ((20*sum(b.ilosc_godzin))+(30*sum(c.ilosc_nadgodzin))+sum(d.wynagrodzenie)) suma from Pracownicy a join godziny b join nadgodziny c join premie d
on (?)
Group by a.nazwisko;



Działa mi, ale pokazuje zbyt duże wyniki.
Podejrzewam że popełniłem błąd w miejscu w którym powyżej dałem znak zapytania.
Proszę o pomoc.

Efekt:
http://zapodaj.net/47da03606ebee.png.html
trueblue
  1. SELECT tmp.imie,tmp.nazwisko,tmp.DATA,
  2. 20*SUM(ilosc*IF(typ=1,1,0))+30*SUM(ilosc*IF(typ=2,1,0))+SUM(ilosc*IF(typ=3,1,0)) AS suma
  3. FROM(
  4. SELECT p.id_pracownik,p.imie,p.nazwisko,g.DATA,SUM(g.ilosc_godzin) AS ilosc,1 AS typ
  5. FROM pracownik AS p, godzina AS g WHERE p.id_pracownik=g.id_pracownik
  6. GROUP BY p.id_pracownik,g.DATA
  7. UNION
  8. SELECT p.id_pracownik,p.imie,p.nazwisko,n.DATA,SUM(n.ilosc_nadgodzin) AS ilosc,2 AS typ
  9. FROM pracownik AS p, nadgodzina AS n WHERE p.id_pracownik=n.id_pracownik
  10. GROUP BY p.id_pracownik,n.DATA
  11. UNION
  12. SELECT p.id_pracownik,p.imie,p.nazwisko,pr.DATA,SUM(pr.wynagrodzenie) AS ilosc,3 AS typ
  13. FROM pracownik AS p, premia AS pr WHERE p.id_pracownik=pr.id_pracownik
  14. GROUP BY p.id_pracownik,pr.DATA)
  15. AS tmp
  16. GROUP BY tmp.id_pracownik,tmp.DATA
myschool
dzięki wink.gif

trochę przerobiłem i działa poprawnie
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.