Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Złączenia wyświetlanie wyników zawsze pojedynczo
seeb
post 6.07.2012, 14:11:38
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


Mam takie zapytanie:
  1. SELECT u.id, u.name AS imie_i_nazwisko, p.nr_iban, w.kwota, w.miesiac
  2. FROM xxx_users AS u
  3. LEFT JOIN xxx_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN xxx_wyplaty AS w ON p.id = w.id
  5. WHERE p.id >0
  6. AND p.Archiwalny = 'N' AND p.grupa='P'
  7. ORDER BY imie_i_nazwisko


Puki w.miesiac występuje raz lub nie występuje wcale nie ma problemów. Problemy pojawiają się w drugim (i później) miesiącu.

Wyniki zaczynają się dublować tzn. osoba pracująca w kwietniu, maju i w czerwcu ma dwa(jesli pracowacował w kwietniu trzy) wyniki.

230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 04-2012
230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 05-2012
230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 06-2012
231 Jadwiga Kowalska PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 05-2012
231 Jadwiga Kowalska PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 06-2012

Nie było by w tym nic złego gdyby nie fakt ze liczba w nawiasie to pole input formularza, które wypełniane jest z zapisanych wyników tylko z poprzedniego miesiąca i jest zmienna wpisywana co miesiąc z programu płacowego.

Siedze nad tym od wczoraj i nie moge nic wymysleć więc może ktoś z was wpadnie na pomysł jak wypisywać złączone dane zależnie od miesiąc (kiedy poprzedni miesiąc ma numer 6 a bieżący 7 to pola są puste ale kiedy już cos wpisaliśmy to przywraca dane z tabeli). Jeśli coś jest niejasne chętnie wyjaśnię.

Go to the top of the page
+Quote Post
pmir13
post 6.07.2012, 18:27:45
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Może napisz jakiś przykładowe dane i spodziewany wynik, bo raczej wątpię by ktoś zrozumiał o co z tymi miesiącami chodzi. Strukturę danych też nietrudno podać, wystarczy wkleić wynik SHOW CREATE TABLE dla wszystkich wykorzystywanych tabel.
Go to the top of the page
+Quote Post
seeb
post 6.07.2012, 19:53:34
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


Spodziewane wyniki (order nie ma znaczenia bo jest dodawany na końcu):
...
id imie i nazwisko pesel numer rachunku bankowego kwota miesiac
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
231 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 05-2012


PLXXXXXXXXXXXXXXXXXXXXXXXXXX numer rachunku bankowego


SHOW CREATE:
  1. CREATE TABLE `jobsys_users` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  4. `username` varchar(150) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  5. `email` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  6. `password` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  7. `usertype` varchar(25) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  8. `block` tinyint(4) NOT NULL DEFAULT '0',
  9. `sendEmail` tinyint(4) DEFAULT '0',
  10. `gid` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  11. `registerDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  12. `lastvisitDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  13. `activation` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  14. `params` text COLLATE utf8_polish_ci NOT NULL,
  15. `stanowisko` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  16. PRIMARY KEY (`id`),
  17. KEY `usertype` (`usertype`),
  18. KEY `idx_name` (`name`),
  19. KEY `gid_block` (`gid`,`block`),
  20. KEY `username` (`username`),
  21. KEY `email` (`email`)
  22. ) ENGINE=MyISAM AUTO_INCREMENT=256 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


  1. CREATE TABLE `jobsys_wyplaty` (
  2. `lp` int(11) NOT NULL AUTO_INCREMENT,
  3. `id` int(11) NOT NULL,
  4. `miesiac`varchar(7) NOT NULL,
  5. `kwota` decimal(9,2) NOT NULL,
  6. `wyk` char(1) COLLATE utf8_polish_ci NOT NULL,
  7. PRIMARY KEY (`lp`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=144 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


  1. CREATE TABLE `jobsys_pracownicy` (
  2. `lp` int(11) NOT NULL AUTO_INCREMENT,
  3. `id` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  4. `Kod` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  5. `Archiwalny` varchar(2) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  6. `Drugie_imie` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  7. `Data_urodzenia` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  8. `Miejsce_urodzenia` varchar(70) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  9. `Imie_ojca` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  10. `Imie_matki` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  11. `Nazwisko_rodowe` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  12. `Nazwisko_rodowe_matki` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  13. `Plec` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  14. `nr_iban` varchar(33) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  15. `nazwisko_iban` varchar(40) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  16. `adres_iban` varchar(80) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  17. `status_zus` varchar(4) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT ' ',
  18. `Pesel` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  19. PRIMARY KEY (`lp`),
  20. UNIQUE KEY `Pesel` (`Pesel`)
  21. ) ENGINE=MyISAM AUTO_INCREMENT=189 DEFAULT CHARSET=utf8
Go to the top of the page
+Quote Post
pmir13
post 6.07.2012, 21:00:59
Post #4





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Ok podałes strukturę tabel i spodziewany wynik, ale wciąż nie ma najważniejszego. Czyli danych na podstawie jakich taki wynik ma powstać. Bo dlaczego Jan Kowalski ma mieć pusto tam gdzie jest kwota a inni nie? Jaka konkretnie informacja w bazie danych ma to powodować?
Go to the top of the page
+Quote Post
seeb
post 6.07.2012, 21:29:58
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


pani kadrowa przepisuje z listy płac kwoty jakie maja zostac przelane, sprawdza to księgowa i ostatecznie wlasciciel/dyrektor daje zielone swiatlo do przelewu.
Na każdym etapie musi być możliwość edycji tej kwoty w przypadku pomyłki. Np kwota jest zgodna z wypracowaną godzinówką ale z jakiś powodów szef zdecydował się dać komuś premię motywacyjną albo została pobrana zaliczka w gotówce.

jeśli np z jakiegos powodu w tym miesiącu ktoś nie stawił się do pracy na umowę zlecenie to dane nadal powinny pozostawać w systemie bo może nie stawiał się przez miesiąc ale ma jakies tam 2-3 godziny jednak wypracowane a raport go nie obejmował albo poprostu nie pracował to nie dostanie kasy.
Pracownicy stali tez mimo tych samych godzin wypracowanych nie dostaną identycznych pensji bo zawsze cos wpływa na pensję. A to ktoś ma wiecej lat stazu, lepsze szkolenia, wykształcenie etc.

jak kiedys dopiszę do tego automatykę to dane tam będą się pojawiały automagicznie z systemu ale puki tego nie zrobię będzie reczne wpisywanie kwot.
Go to the top of the page
+Quote Post
pmir13
post 6.07.2012, 21:56:56
Post #6





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Chyba w ogóle nie przeczytałeś mojego ostatniego postu. Jaka informacja w bazie danych odpowiada za to, co ma się pojawić jako kwota?
Go to the top of the page
+Quote Post
seeb
post 6.07.2012, 22:00:38
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


jobsys_wyplaty.kwota wydawało mi się to na tyle oczywiste, że nie napisałem.

Ten post edytował seeb 6.07.2012, 22:02:10
Go to the top of the page
+Quote Post
pmir13
post 6.07.2012, 22:07:16
Post #8





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


W takim razie pierwsze zapytanie wyświetla dokładnie to co chcesz i temat można zamknąć.
Go to the top of the page
+Quote Post
seeb
post 6.07.2012, 22:34:52
Post #9





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


Problem w tym, że nie. Wszystko gra gdy w bazie z kwotami jest pusto i gdy jest pierwszy miesiąc jednak gdy są dwa miesiące wyniki się dublują jak w przykładzie z pierwszego postu.

Oczekuję wyniku np:
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 06-2012

a dostaję w drugim miesiącu coś takiego:

230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ 1250] 05-2012
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2432.53] 05-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1648.22] 05-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 06-2012

czyli zamiast w lipcu dostac wyniki tylko z czerwca dostaję też z maja gdybyśmy mówili też o kwietniu to otrzymalibyśmy jeszcze jeden wiersz dla każdego zatrudnionego
i tu jest problem! Zawarłem to w pierwszym poście ale tu przypominam czego dotyczy problem.
Go to the top of the page
+Quote Post
mmmmmmm
post 6.07.2012, 22:45:46
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. SELECT u.id, u.name AS imie_i_nazwisko, p.nr_iban, w.kwota, w.miesiac
  2. FROM xxx_users AS u
  3. LEFT JOIN xxx_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN xxx_wyplaty AS w ON p.id = w.id
  5. JOIN (SELECT id, MAX(miesiac) miesiac FROM xxx_wyplaty GROUP BY id) x ON x.id=w.id AND x.miesiac=w.miesiac
  6. WHERE p.id >0
  7. AND p.Archiwalny = 'N' AND p.grupa='P'
  8. ORDER BY imie_i_nazwisko
Go to the top of the page
+Quote Post
pmir13
post 6.07.2012, 23:16:33
Post #11





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Czyli po prostu potrzebujesz ograniczyć wyniki do poprzedniego miesiąca?

W takim razie wystarczy dodać do WHERE nowy warunek:
  1. AND w.miesiac = date_format(now()-interval 1 month, '%Y-%m')
Go to the top of the page
+Quote Post
seeb
post 12.07.2012, 10:27:27
Post #12





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 6.12.2007
Skąd: Poznań

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


Tak w jednym tak w drugim przypadku coś nie gra. Pierwszy o ile dostałem wyniki wprawdzie rozbierzne od oczekiwanych ale ze spodziewanych 150 otrzymałem 132 o tyle w drugim przypadku zero wyników.

Potrzebuję listę wszystkich pracowników dla nowego miesiąca wynikającą ze złączenia users i pracownicy bez względu na to czy mieli czy nie wypłaty kiedykolwiek. Jednak jeśli już podaliśmy dane za miesiąc poprzedni powinny być pobrane. Może w ten sposób łatwiej nam będzie się skomunikować.

W każdym razie dziekuję za już okazane zainteresowanie i liczę na jeszcze.

mmmmmmm w twoim rozwiązaniu brakuje nowych pracowników (którzy nie pracowali w maju a co za tym idzie w czerwcu nie otrzymywali wynagrodzenia)

Rozwiązanie mojego problemu:
  1. SELECT u.id, u.name AS imie_i_nazwisko, p.pesel, p.nr_iban, w.kwota, w.miesiac
  2. FROM jobsys_users AS u
  3. LEFT JOIN jobsys_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN jobsys_wyplaty AS w ON p.id = w.id
  5. AND w.miesiac = date_format(now()-interval 1 month, '%m-%Y')
  6. WHERE p.id > 0
  7. AND p.Archiwalny = 'N' AND p.grupa='P'
  8. ORDER BY imie_i_nazwisko


Istotą było gdzie wstawić ów interwał.
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: 24.06.2025 - 01:56