Zasada działania:
Mam proste zapytanie, gdzie do tabeli z transakcjami (transaction_table AS tt, dodawanymi przez pracowników) doklejam LEFT JOINEM tabelę z danymi wyeksportowanymi z programu kasowego (table_import AS ti). Na koniec każdego dnia jest eksport z programu i import do bazy danych, gdzie są dane o zysku do każdej transakcji, obie tabele łącze numerem 'mtn', który jest nadawany przez program kasowy do każdej transakcji (widoczny w tabeli ti), ten numer przepisuje również pracownik , gdy na bieżąco dodaje tr. do bazy do tabeli z transakcjami (tt) - program kasowy pokazuje mu ten numer przed zatwierdzeniem transakcji. I wszystko jak narazie działa...
Problem:
Problem jest taki, że, gdy w danym dniu nie zaimportuję danych z programu kasowego (ti), to przy tym zapytaniu nawet nie wyświetlą mi się dzisiejsze transakcje które są jeszcze bez zaimportowanego zysku dodane przez pracownika w tabeli (tt). Wszystkie funkcje SUM() z tabeli ti w tych dniach z oczywistego powodu wywalają błąd (bo danych do wyliczeń tam jeszcze nie ma)

Działające zapytanie:
SELECT tt.id_placowki, data_transakcji, rodzaj_transakcji, STATUS, zysk, COUNT(data_transakcji) AS suma_tt_w_mc, SUM(IF(ti.Direction = 'I', -1 * ti.ClearCharges, 0)) AS zysk_inbound_imported, SUM(IF(ti.Direction = 'O', ti.TotalCharges - ti.ClearCharges, 0)) AS zysk_outbound_imported, SUM(IF(ti.Direction = 'I', -1 * ti.ClearCharges, 0) + IF(ti.Direction = 'O', ti.TotalCharges - ti.ClearCharges, 0)) AS zysk_sum, FROM transaction_table AS tt LEFT JOIN point_of_sell AS pos ON pos.id_placowki = tt.id_placowki LEFT OUTER JOIN table_import AS ti ON ti.MTN = tt.mtn WHERE YEAR(data_transakcji) = '$rok' AND MONTH(data_transakcji) = '$miesiac' AND tt.id_placowki = '$placowka' AND ti.PayDate <> '0000-00-00' AND (ti.PayDate = tt.data_transakcji OR ti.RecDate = tt.data_transakcji) GROUP BY data_transakcji ORDER BY data_transakcji ASC
Moje pytania:
1. Czy nie jest tak, że jak dam do t1 LEFT OUTER JOIN t2, to powinien mi i pokazać wszystkie dane z z t1 (tutaj transaction_table), a w pola pobierane z t2 (tutaj table_import), gdzie nic niema - powinien dokleić NULL?
2. Jeśli 1 jest na nie, to jak spreparować zapytanie, aby wyświetlało mi zerowe dane, z aktualnego dnia, gdy tabela importu jeszcze nie ma powiązanych rekordów z transakcjami w tt? Zapewne tutaj chyba trzeba użyć jakiegoś większego IF NOT EXIST i IF ELSE, co próbowałem bezskutecznie, bo nigdy nie miałem potrzeby ich używania.
Tak więc próbowałem zabrać się do tego od strony zapytania WHERE NOT EXIST w imię zasady "SELECT * FROM tabela t1 WHERE NOT EXISTS (SELECT 1 FROM druga_tabela t2 WHERE t1.id = t2.id)"
Końcówka zapytania od WHERE:
WHERE NOT EXISTS (SELECT * FROM transaction_table WHERE YEAR(data_transakcji) = '$rok' AND MONTH(data_transakcji) = '$miesiac' AND id_placowki = '$placowka') AND YEAR(data_transakcji) = '$rok' AND MONTH(data_transakcji) = '$miesiac' AND tt.id_placowki = '$placowka' AND ti.PayDate <> '0000-00-00' AND (ti.PayDate = tt.data_transakcji OR ti.RecDate = tt.data_transakcji) GROUP BY data_transakcji ORDER BY data_transakcji ASC
jak i też od strony warunków IF przy SELECT
SELECT tt.id_placowki, data_transakcji, rodzaj_transakcji, STATUS, zysk, COUNT(data_transakcji) AS suma_tt_w_mc, IF EXISTS ti.Direction AND ti.Direction = 'I' THEN SUM(-1 * evi.ClearChargesLOC) AS zysk_inbound_imported ELSE IF EXISTS ti.Direction AND ti.Direction = 'O' THEN SUM(ti.TotalCharges - ti.ClearCharges) AS zysk_outbound_imported ELSE IF NOT EXISTS evi.Direction THEN ti.ClearCharges = 0 AND ti.TotalCharges = 0 END IF FROM transaction_table AS tt LEFT JOIN point_of_sell AS pos ON pos.id_placowki = tt.id_placowki LEFT OUTER JOIN table_import AS ti ON ti.MTN = tt.mtn WHERE YEAR(data_transakcji) = '$rok' AND MONTH(data_transakcji) = '$miesiac' AND tt.id_placowki = '$placowka' AND ti.PayDate <> '0000-00-00' AND (ti.PayDate = tt.data_transakcji OR ti.RecDate = tt.data_transakcji) GROUP BY data_transakcji ORDER BY data_transakcji ASC
Naprowadźcie mnie, w którym najbardziej optymalnym kierunku szukać informacji jak przyjdzie mi ta książka? Domyślam się, że jeszcze źle kombinuje z poprawnością zapytania, ale założenie teoretyczne idzie w dobrym kierunku?