2

目标/背景

  • 我正在梳理工单系统以查看工单是否符合某些标准
    • (例如,如果它们不是第 3 阶段、第 2 阶段,甚至不是第 1 阶段)。
  • 这些“阶段”已由管理层定义。
  • 我想按报告的年份分组,然后按工艺分组,然后查看在这 3 个“非阶段”中的每个分组中有多少工作订单。

查询

select yearreported
, theleadcraft
, count(NotStage3)
, count(NotStage2)
, count(NotStage1)

from
(
    select extract(year from reportdate) as YearReported
    , Nvl(leadcraft, 'NONE') as TheLeadCraft
    , CASE when status not in ('CAN', 'CLOSE') then 1 else 0 END as NotStage3
    , CASE when status not in ('CAN', 'CLOSE', 'COMP') then 1 else 0 END as NotStage2
    , CASE when status not in ('CAN', 'CLOSE', 'COMP', 'WORKDONE') then 1 else 0  END as NotStage1
    from workorder
) query 

group by yearreported, theleadcraft;
;

问题/问题

  • 这似乎可行,但 notstage1、notstage2 和 notstage1 的所有计数结果都相同,尽管查询了某些情况并找到了一些我知道不同的情况。
  • 这是实现我要计算的案例陈述的正确方法吗?
  • 我应该改用 DECODE() 吗?

提前感谢您的帮助!

4

4 回答 4

9

1 和 0 的 COUNT() 相同 - 可能您想要 SUM() 或 COUNT() 1 或 null。

于 2013-01-08T13:50:16.533 回答
0

Count 不计算 NULL -s。尝试这个:

, CASE when status not in ('CAN', 'CLOSE') then 1 END as NotStage3
, CASE when status not in ('CAN', 'CLOSE', 'COMP') then 1 END as NotStage2
, CASE when status not in ('CAN', 'CLOSE', 'COMP', 'WORKDONE') then 1 END as NotStage1
于 2013-01-08T13:49:47.090 回答
0

你不应该使用decode.

您编写查询的方式是您真正想要sum()的,而不是count()

select yearreported, theleadcraft, sum(NotStage3), sum(NotStage2), sum(NotStage1)

该函数count()在应用于列时具有误导性名称(在我看来)。它正在计算非 NULL 值的数量。由于“1”和“0”都是非空的,它们被计算在内。

于 2013-01-08T14:10:54.567 回答
0

是的,您可以通过对上面的语句进行简单修改来做到这一点

尝试这个 :

select yearreported
, theleadcraft
, count(decode (NotStage3, 1,1) )
, count(decode (NotStage2, 1,1) )
, count(decode (NotStage1, 1,1) )

from
(
    select extract(year from reportdate) as YearReported
    , Nvl(leadcraft, 'NONE') as TheLeadCraft
    , CASE when status not in ('CAN', 'CLOSE') then 1 else 0 END as NotStage3
    , CASE when status not in ('CAN', 'CLOSE', 'COMP') then 1 else 0 END as NotStage2
    , CASE when status not in ('CAN', 'CLOSE', 'COMP', 'WORKDONE') then 1 else 0  END as NotStage1
    from workorder
) query 

group by yearreported, theleadcraft;

问候,

于 2013-01-08T16:30:16.937 回答