2

我有一点代码,我不能完全正常工作。给我带来麻烦的部分是:

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

我需要做的是告诉, 或条件不再满足时@Platinum重置回。zeroClass_SubsetRegNum

有任何想法吗?

整个代码:

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:

样本数据 http://nadacforum.com/Platinum.png

4

2 回答 2

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,  
于 2012-06-01T05:25:53.313 回答
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 ...
于 2012-05-31T03:40:51.447 回答