2013-04-05 18 views
8

Mam następującą tabelę oznaczającą nauczyciela uczącego uczniów w małych grupach. Każdy uczeń ma wpis do bazy danych. Uczeń może być sam lub w grupie. Chciałbym obliczyć "wynagrodzenie" opiekuna jako takie: opłata jest oparta na czasie spędzonym - oznacza to, że na każde posiedzenie (z jednym lub więcej uczniów) zostanie obliczone tylko jedno posiedzenie - odrębne posiedzenia! Czasy rozpoczęcia i zakończenia to czasy unix.Oblicz wynagrodzenie opiekuna na podstawie różnych posiedzeń przy użyciu mysql

<pre> 
    start end  attendance 
1359882000 1359882090 1 
1359867600 1359867690 0 
1359867600 1359867690 1 
1359867600 1359867690 0 
1360472400 1360477800 1 
1360472400 1360477800 1 
1359867600 1359867690 1 
1359914400 1359919800 1 
1360000800 1360006200 1 
1360000800 1360006200 0 
1360000800 1360006200 1 

</pre> 

To co próbowałem: bez powodzenia - Nie mogę uzyskać odpowiedni czas (liczbę godzin dla wszystkich odrębnych posiedzeń)

 
    SELECT YEAR(FROM_UNIXTIME(start)) AS year, 
    MONTHNAME(STR_TO_DATE(MONTH(FROM_UNIXTIME(start)), '%m')) AS month, 
    COUNT(DISTINCT start) AS sittings, 
    SUM(TRUNCATE((end-start)/3600, 1)) as duration 
    FROM schedules 
    GROUP BY 
    YEAR(FROM_UNIXTIME(start)), 
    MONTH(FROM_UNIXTIME(start)) 

Thanks for your wniosków/wsparcie!

EDIT: Wymagane wyniki

Rate = 25 
Year Month Sittings Duration Bounty 
2013 February  2   2.2   2.2*25 
2013 April  4   12.0   12.0*25 
+0

+1 za zamieszczanie informacji o tym, co wypróbowałeś/aś –

+0

Czy możesz również zamieścić żądany wynik? –

+1

@JW właśnie dodał pożądany wynik. Czas trwania jest oparty na końcu)/3600 odrębnych posiedzeń – dorogz

Odpowiedz

4

Prawdopodobnie mógłby zrobić coś z podzapytania, miałem grać z SQL skrzypcach, jak to wygląda dla Ciebie. Link do sql skrzypce: http://sqlfiddle.com/#!2/50718c/3

SELECT 
    YEAR(d.date) AS year, 
    MONTH(d.date) AS month, 
    COUNT(*) AS sittings, 
    SUM(d.duration) AS duration_mins 
FROM (
    SELECT 
    DATE(FROM_UNIXTIME(s.start)) AS date, 
    s.attendance, 
    end-start AS duration 
    FROM schedules s 
) d 

GROUP BY 
    year, 
    month 

ja naprawdę nie mogłem zobaczyć, gdzie frekwencja wchodzi to w chwili obecnej nie określono. Zapytanie wewnętrzne jest odpowiedzialne za przyjęcie harmonogramów, wyodrębnienie daty rozpoczęcia i czasu trwania (w sekundach).

Zapytanie zewnętrzne wykorzystuje następnie te pochodne wartości, ale grupuje je, aby uzyskać sumy. Możesz opracować stąd, np. Być może chcesz tylko wybrać, gdzie frekwencja> 0, a może chcesz pomnożyć przez obecność.

W następnym przykładzie I zostało to zrobione, obliczania czasu, w godzinach, a nie, i obliczania obowiązującego czasu trwania gdzie sesje mają> 1 frekwencji wraz z odpowiednim nagród zakładając laski == godzin * stawka: http://sqlfiddle.com/#!2/50718c/21

SELECT 
    YEAR(d.date) AS year, 
    MONTH(d.date) AS month, 
    COUNT(*) AS sittings, 
    SUM(d.duration) AS duration, 
    SUM(
    IF(d.attendance>0,1,0) 
) AS sittingsWorthBounty, 
    SUM(
    IF(d.attendance>0,d.duration,0) 
) AS durationForBounty, 
    SUM(
    IF(d.attendance>0,d.bounty,0) 
) AS bounty 

FROM (
    SELECT 
    DATE(FROM_UNIXTIME(s.start)) AS date, 
    s.attendance, 
    (end-start)/3600 AS duration, 
    (end-start)/3600 * @rate AS bounty 
    FROM schedules s, 
    (SELECT @rate := 25) v 
) d 

GROUP BY 
    year, 
    month 

Kluczowym punktem jest to, że w podzapytaniu wykonujesz wszystkie obliczenia w rzędzie. Główne zapytanie jest następnie odpowiedzialne za grupowanie wyników i uzyskiwanie sum. Instrukcje IF w zewnętrznej kwerendzie można na przykład łatwo przenieść do podkwerendy. Po prostu umieściłem je w ten sposób, abyś mógł zobaczyć, skąd pochodzą wartości.

+0

Dzięki @Simon! Wydaje mi się, że mam tylko jeden miesiąc! Kody (szczególnie drugie) wskazują mi właściwy kierunek, ale wciąż czegoś brakuje. – dorogz

+0

Podane przykłady są w lutym 2013. Zobacz załączony przykład z niektórymi znacznikami czasu w marcu http://sqlfiddle.com/#!2/7feae/2 –

+0

Czy to rozwiązało Twój problem, czy nadal jest coś, co daje Ci problemy z tym związane? –

Powiązane problemy