Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sumowanie elementów z różnych tabel
myschool
post 8.01.2015, 20:23:24
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.01.2015

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
Szymciosek
post 8.01.2015, 23:23:47
Post #2





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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........
Go to the top of the page
+Quote Post
phpion
post 9.01.2015, 08:28:53
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
myschool
post 11.01.2015, 18:11:28
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.01.2015

Ostrzeżenie: (0%)
-----


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

Ten post edytował myschool 11.01.2015, 18:12:58
Go to the top of the page
+Quote Post
trueblue
post 11.01.2015, 19:37:00
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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


Ten post edytował trueblue 11.01.2015, 19:40:53


--------------------
Go to the top of the page
+Quote Post
myschool
post 11.01.2015, 23:43:24
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.01.2015

Ostrzeżenie: (0%)
-----


dzięki wink.gif

trochę przerobiłem i działa poprawnie
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:44