Warunki MySQL z wielu wierszy
Próbowałem obliczyć tabelę za pomocąSELECT
komunikat. Mam taki stół:
--------------------------------------------------------------
AgentID | Date | Incurred | FallOffDate
==============================================================
kegomez | 2012-11-19 | 2.0 | 2013-11-19
kegomez | 2012-11-24 | 0.5 | 2013-11-24
kegomez | 2013-01-21 | 2.0 | 2014-01-21
kegomez | 2013-08-18 | 2.0 | 2014-08-18
Próbowałem wykonać obliczenia podczas selekcji i ewentualnie utworzyć widok, ale do tej pory nie miałem szczęścia. Ostatecznie tabela będzie wyglądać następująco.
--------------------------------------------------------------
AgentID | Date | Incurred | 90 | 180 | Total | FallOffDate
==============================================================
kegomez | 2012-11-19 | 2.0 | 2.0 | 2.0 | 2.0 | 2013-11-19
kegomez | 2012-11-24 | 0.5 | 0.5 | 0.5 | 2.5 | 2013-11-24
kegomez | 2013-01-21 | 2.0 | 1.0 | 0.0 | 2.5 | 2014-01-21
kegomez | 2013-08-18 | 2.0 | 2.0 | 2.0 | 4.5 | 2014-08-18
Całkowita kolumna używa wartości z poprzedniego wiersza do obliczenia jego wartości. Na przykład data w wierszu 4 będzie musiała odnosić się do daty w wierszu 3, aby sprawdzić, czy data jest większa. Czy muszę wypróbować to z podzapytaniem? Jak to w końcu zadziała, co 90 dni do 180 dni agent straci 1 punkt, jeśli nie będzie już więcej. Dlatego powód, dla którego muszę odwoływać się do innych wierszy. Jeśli to pomaga, dane są obecnie w programie Excel, ale stają się zbyt duże, aby je zarządzać i musimy przenieść je do czegoś, co działa lepiej.
SELECT AgentID, Date, Incurred,
@90 := IF(Date<=CURDATE()-90 AND @r=0, Incurred-1.0, IF(Difference>90, Incurred-1, Incurred)) AS 90Day,
@180 := IF(Date<=CURDATE()-90 AND @r=0, Incurred-1.0, IF(Difference>180, Incurred-2, @90)) AS 180Day,
@Total := IF(@180<0,0,IF(FallOffDate<=CURDATE(),0, @180)) AS Total,
FallOffDate
FROM (SELECT mo.AgentID, mo.Incurred, FallOffDate,
@r AS LEAD_date,
DATEDIFF(@r,Date) AS Difference,
(@r := Date) AS Date
FROM (
SELECT m.*
FROM (
SELECT @_date = NULL
) VARIABLE,
attendance m
ORDER BY
AgentID, Date DESC
) mo
WHERE (CASE WHEN @_date IS NULL OR @_date <> date THEN @r := NULL ELSE NULL END IS NULL)
AND (@_date := date) IS NOT NULL) T
ORDER BY AgentID, Date;