Usiłuję przygotować raport dotyczący rekordów czasu pracy pracownika.
Mamy dwie tabele specjalnie na to pytanie. Pracownicy są wyszczególnieni w Members
tabeli i każdego dnia wprowadzają wpisy czasu pracy, którą wykonali i są przechowywane w Time_Entry
tabeli.
Przykładowa konfiguracja z SQL Fiddle: http://sqlfiddle.com/#!3/e3806/7
Końcowy wynik, którego szukam, to tabela, która pokazuje WSZYSTKIE na Members
liście kolumn, a następnie pokazuje ich sumę godzin dla daty zapytanej w innych kolumnach.
Problem wydaje się polegać na tym, że jeśli nie ma wiersza w Time_Entry
tabeli dla konkretnego elementu, to jest teraz wiersz dla tego elementu. Wypróbowałem kilka różnych typów złączeń (lewy, prawy, wewnętrzny, zewnętrzny, pełny zewnętrzny itp.), Ale żaden nie wydaje mi się tego, czego chcę, co byłoby (w oparciu o ostatni przykład w SQL Fiddle):
/*** Desired End Result ***/
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis | 0 | 11-10-2013 | 0 | 0
BTronton | 0 | 11-10-2013 | 0 | 0
CJones | 0 | 11-10-2013 | 0 | 0
DSmith | 0 | 11-10-2013 | 0 | 0
EGirsch | 1 | 11-10-2013 | 0.92 | 1
FRowden | 0 | 11-10-2013 | 0 | 0
Co aktualnie otrzymuję, gdy pytam o konkretną datę 11-1:
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
EGirsch | 1 | 11-10-2013 | 0.92 | 1
Co jest poprawne w oparciu o jeden wiersz Wpisu Czasu, który jest datowany na 11-10-2013 dla EGirsch, ale muszę zobaczyć zera dla innych członków, aby uzyskać raporty i ewentualnie internetowy pulpit nawigacyjny / raport dla tych informacji.
To jest moje pierwsze pytanie i podczas wyszukiwania zapytań Join itp. Nie jestem pewien, jak mogłaby się nazywać ta funkcja, więc mam nadzieję, że nie jest to duplikat i pomoże innym również w znalezieniu rozwiązania podobne problemy.
źródło
WHERE
iAND
. Pierwotnie użyłem aliasów, ale sqlfiddle nie wydawało się to lubić, więc po prostu przeszedłem do pełnego formatu. Dzięki za inne wskazówki SQL. Czy poleciłbyśISNULL
lubCOALESCE
uczyniłby danymi 0 zamiastNULL
? Dzięki jeszcze raz!Kiedy w przeszłości miałem do czynienia z tego typu problemem, utworzyłem tabelę „liczb”, która pomaga radzić sobie z brakującymi wierszami.
Tabelę liczb utworzyłem specjalnie z myślą o datach, ponieważ:
Spowoduje to utworzenie tabeli z pojedynczym wierszem dla każdej daty między 1900-01-01 a 2099-12-31. Używam,
TOP(73049)
aby ograniczyć zakres dat wygenerowany w moim przykładzie do tych dat - jeśli pracujesz z innym zakresem dat, możesz dostosować tę liczbę.Następnie dodaję
dDates
tabelę do mojego zapytania, aby wiersz był zwracany dla każdej daty w żądanym zakresie dla każdegomember_id
. Wynik jest następnie dołączany doTime_Entry
tabeli jako taki:Umożliwia to określenie zakresu dat dla raportu.
Możesz dodatkowo zawęzić wyniki, dodając
COALESCE(...)
iSUM(...)
zgodnie z:Powoduje to następujące dane wyjściowe dla przykładowych danych:
źródło