MySQL查询中的嵌套CASE

时间:2011-02-08 03:49:47

标签: mysql

我想计算任务为1到3的订单总数。 然后,如果entry1已经计数,我需要检查状态是否正在进行(所有状态都未完成)。 我需要在这里使用嵌套的CASE我不想将它包含在我的WHERE子句中 因为我稍后会加入更多的表格。

这是我的样本表:

ID  +    orderid  +  task    +  status
1   |    1        |  1       |  Completed
2   |    2        |  1       |  Saved
3   |    3        |  1       |  Saved
4   |    1        |  2       |  Completed
5   |    1        |  3       |  Completed

正如您在任务栏中看到的那样,有条目1,正在进行的总数为2,已完成为1。 当我执行查询时,当我使用entry1并且状态未保存时我得到2的结果但是在删除NOT时我也得到2的结果。但是当我使用('COMPLETED')时,我得到了正确的结果。那么在我的代码中('SAVED')的问题是什么。我希望我在问题中没有错误输入任何内容。

这是我的示例查询:

SELECT 
    COUNT(
        CASE task
            WHEN 1 THEN task ELSE NULL
        END
        AND
        CASE `status`
            WHEN NOT UPPER('SAVED') THEN `status` ELSE NULL
        END
        ) e1_inprogress
   FROM tableName;

现在我只使用任务1,但在我的真实代码中,我还需要在COUNT中包含所有任务和所有状态。 我觉得这很简单,也许我错过了一些东西,请纠正我。 如果你有另一种方式,请让我们知道。

1 个答案:

答案 0 :(得分:1)

使用此

SELECT 
    COUNT(
        CASE WHEN task = 1 AND Upper(`status`) = 'SAVED' THEN 1 END
        ) e1_inprogress
   FROM tableName;

<小时/> 为什么它不起作用?

WHEN NOT UPPER('SAVED')

NOT UPPER('SAVED')变为NOT (TRUE)变为FALSE,因此您要将CASE Status与值FALSE进行比较。

您的查询可能是

CASE Upper(`Status`)
WHEN 'SAVED' THEN ... ELSE ...

(nb:交换THEN和ELSE的代码)