我正在使用ORACLE db,我正在尝试为以下要求创建SQL查询.
以下是我的快照:
ID STATUS ---------- 1 WORKING 1 QUEUING 1 SLEEPING 2 Failed 2 SLEEPING 2 SLEEPING 3 QUEUING 3 IDLE
预期产量:
1 WORKING 2 Failed 3 QUEUING
状态可以是WORKING,QUEUING,Failed,SLEEPING
我想在SQL查询中插入以下条件,这些条件在首选项顺序中列出:
>如果组中的任何条目包含’WORKING’,我想设置final
结果为该组的“工作”
>如果任何条目为’Failed’,则结果为’Failed’
>如果任何条目是’QUEUING’,那么结果是’QUEUING’;
>默认’空闲’.
解决方法
与子查询结合使用的数据透视查询应该可以为您提供所需内容:
SELECT t.ID,CASE WHEN t.Working > 0 THEN 'WORKING' WHEN t.Failed > 0 THEN 'Failed' WHEN t.Queuing > 0 THEN 'QUEUING' ELSE 'IDLE' END AS STATUS FROM ( SELECT ID,SUM(CASE WHEN STATUS = 'WORKING' THEN 1 ELSE 0 END) AS Working,SUM(CASE WHEN STATUS = 'Failed' THEN 1 ELSE 0 END) AS Failed,SUM(CASE WHEN STATUS = 'QUEUING' THEN 1 ELSE 0 END) AS Queuing FROM yourTable GROUP BY ID ) t
外部CASE表达式正确表示首选项的原因是因为Oracle总是执行short circuit evaluation.这意味着如果查询遇到与WORKING匹配的ID,则不会执行其他两个检查(类似的逻辑适用于每个状态).