将变量重置为0

时间:2012-05-31 03:01:02

标签: mysql sql

我有一些代码,我无法正常工作。给我带来麻烦的部分是:

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

我需要做的是在@Platinumzero条件不再符合后,告诉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

2 个答案:

答案 0 :(得分:1)

我想我现在看到了这个问题。

正在计算Platinum的行集由RegNumClass_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,  

答案 1 :(得分: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 ...