2012-05-31 2 views
2

У меня есть немного кода, который я не могу нормально работать. Часть дает мне проблемы заключается в следующем:Сброс переменной до 0

IF(Class_Subset = @prevSub AND RegNum = @prevNum AND `DRI` >99.99 , 
@Platinum :[email protected] + 1 ,'' ) 

Что мне нужно сделать, это сказать @Platinum, чтобы сбросить обратно zero один раз Class_Subset или RegNum условия больше не выполняются.

Любые идеи?

Всего код:

SELECT 
Harley.Hgt, Harley.RegNum, Harley.Callname, Harley.OLastname, 
Harley.Tpe, Harley.Points, Harley.Class, Harley.Total_Points, 
Harley.Title, Harley.Platinum, Harley.Silver_Purple, 
Harley.Date_Earned, Harley.Judge, Harley.HostClub, Harley.DRI, 
Harley.Class_Subset, Harley.IncorrectRegNum, Harley.MemNum, Harley.ID 
FROM 
(
    SELECT 
    Hgt, RegNum, Callname, OLastname, Tpe, Points, Class, 
    Total_Points, Title, Silver_Purple, Date_Earned, Judge, 
    HostClub, DRI, Class_Subset, IncorrectRegNum, MemNum, ID, 
    IF (
    Class_Subset = @prevSub 
    AND RegNum = @prevNum 
    AND `DRI` > 99.99, 
    @Platinum := @Platinum + 1, 
    0 
    ) AS Platinum, 
    @prevSub := Class_Subset, 
    @prevNum := RegNum 
    FROM 
    Harley, 
    ( 
     SELECT @Platinum := 0, @prevSub := '', @prevNum := '' 
    ) r 
    ORDER BY RegNum, Class_Subset, Date_Earned 
) Harley 

Это то, что файл выглядит, вы можете понять, почему он должен помнить переменную во время матча Regnum и Subset, но затем сбрасывается в 0, когда они меняются:

sample data http://nadacforum.com/Platinum.png

+0

Вы хотите вернуть значение из выражения или просто назначить ноль переменной? Вы используете это в запросе или функции/процедуре? – bfavaretto

+0

Пока соответствие RegNum и Subset, я хочу, чтобы переменная оставалась активной, но после того, как одно из этих изменений я хочу, чтобы она вернулась к нулю. Это находится в запросе –

+0

@ChrisNelson выводит вывод 'if' usnig' в @ Platinum'. См. Мой ответ –

ответ

1

Думаю, теперь я вижу проблему.

В строке, где множество Platinum вычисляется упорядочено RegNum и Class_Subset (в частности), что хорошо, как вычисление действительно полагается на эти столбцы упорядочены. Но условие IF() также включает столбец DRI, и, как видно на скриншоте, последовательность значений DRI, превышающих 99.99, может быть прервана в пределах одной группы (RegNum, Class_Subset). Когда он будет восстановлен, вам нужны платиновые значения для продолжения, не для сброса до 1.

Следовательно, ваше выражение @Platinum должно быть немного сложнее. Вот один из способов его изменения:

@Platinum := IF (
Class_Subset = @prevSub 
AND RegNum = @prevNum 
AND `DRI` > 99.99, 
@Platinum, 
0 
) + (`DRI` > 99.99) AS Platinum, 
+0

Это сработало отлично. Я очень ценю помощь. –

0

Вы должны искать:

if(
    Class_Subset = @prevSub 
    AND RegNum = @prevNum 
    AND `DRI` >99.99, 
    @Platinum + 1, 
    0 
) into @Platinum 

С вышеуказанным изменением ваш запрос может выглядеть так:

select /* some fields here, */ if (...as above... from ... 
+0

Нет кубиков. Он отлично подходит для первого класса, но затем, как только он попадает в новый, переменная не сбрасывается. Таким образом, итоговая сумма для первого класса равна 43, а затем следующая должна начинаться с 1, но это 44. Я приложил весь запрос выше, если я что-то ошибся –

Смежные вопросы