MySQL:使用sum in(case when)语句显示0作为结果

时间:2019-11-25 20:34:02

标签: mysql

MySQL的新手。.so请帮助我使用此基本代码。 我有一个类似这样的查询...

reviewYear

并给出正确的结果-here

但是我想在case when语句之后使用sum,以便我可以得到BO = 1并按年份分组的总值,所以我进行了以下更改-

select weekofyear(id_time),
(id),

@Tat1:=exp1,
@Tat2:=exp2,
@check1:=exp3,
@check2:=exp4, 
(case when @check2=0 then 
        (case when  (@Tat1>(@Tat2+30) or  (@check1=1 and (@Tat1>@Tat2+10)))  then 1  else 0 end)  
        else 
        (case when (@Tat1>(@Tat2+30) or  (@check1=1 and (@Tat1>@Tat2+20))) then 1 else 0 end) 
    end) as BO

from datb
where cid=18
and id_time between '2019-11-01 06:00:00' and '2019-11-25 06:00:00'

,但始终返回0作为输出。 输出-这里2

请帮助,我不知道我在做什么错。

感谢!

1 个答案:

答案 0 :(得分:0)

正如其他人已经说过的那样,会话变量可能是不可预测的(尤其是当聚合混入时)。就是说,您似乎并没有使用会话变量将值从一行转移到另一行(通常这样做),而是只是为不需要重复的计算创建别名。

一种更好的处理方式就是通过子查询。

SELECT woy, id, Tat1, Tat2, check1, check2
    , CASE 
        WHEN check2=0 THEN (
            CASE 
            WHEN (Tat1>(Tat2+30) OR (check1=1 AND (Tat1>Tat2+10))) THEN 1 
            ELSE 0 
            END
        )
        ELSE (
            CASE WHEN (Tat1>(Tat2+30) OR (check1=1 AND (Tat1>Tat2+20))) THEN 1 
            ELSE 0 
            END
        ) 
    END AS BO
FROM (
    SELECT WEEKOFYEAR(id_time) AS woy
        , id
        , exp1 AS Tat1
        , exp2 AS Tat2
        , exp3 AS check1
        , exp4 AS check2
    FROM datb
    WHERE cid=18
        AND id_time BETWEEN '2019-11-01 06:00:00' AND '2019-11-25 06:00:00'
) AS subQ
;

然后您可以调整上面的查询以进行聚合,或者将其用作聚合外部查询的子查询。