我有一些代码,我无法正常工作。给我带来麻烦的部分是:
IF( Class_Subset = @prevSub AND RegNum = @prevNum AND `DRI` >99.99 ,
@Platinum :=@Platinum + 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:
答案 0 :(得分: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,
答案 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 ...