2016-09-07 52 views
0

我有一个案例查询,需要重新编写它以获得完美结果。当前查询为如下:如何编写嵌套案例查询并获得正确结果

CASE 
WHEN MonthsRetrieved <= 6 AND MonthsRetrieved > 0 THEN 
    CASE 
     WHEN MonthsSinceLastReceipt <= 6 THEN 'Fast' 
     WHEN MonthsSinceLastReceipt > 6 AND MonthsSinceLastReceipt <= 12 THEN 'Slow' 
     WHEN MonthsSinceLastReceipt > 12 AND MonthsSinceLastReceipt <= 18 THEN 'Very Slow' 
     WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
     WHEN OpeningQty = 0 THEN 'New Items' 
     WHEN QtyIssued = 0 THEN 'Non-Moving' 
    ELSE 'Fast' 
    END 
WHEN MonthsRetrieved > 6 AND MonthsRetrieved <= 12 THEN 
    CASE 
     WHEN MonthsRetrieved <= 12 THEN 'Slow' 
     WHEN MonthsSinceLastReceipt > 12 AND MonthsSinceLastReceipt <= 18 THEN 'Very Slow' 
     WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
     WHEN OpeningQty = 0 THEN 'New Items' 
     WHEN QtyIssued = 0 THEN 'Non-Moving' 
    ELSE 'Slow' 
    END 
WHEN MonthsRetrieved > 12 AND MonthsRetrieved <= 18 THEN 
    CASE 
     WHEN MonthsSinceLastReceipt <= 18 THEN 'Very Slow' 
     WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
     WHEN OpeningQty = 0 THEN 'New Items' 
     WHEN QtyIssued = 0 THEN 'Non-Moving' 
    ELSE 'Very Slow' 
    END 
WHEN MonthsRetrieved = 0 THEN 
    CASE 
     WHEN MonthsSinceLastReceipt = 0 THEN 'Dead' 
     WHEN OpeningQty = 0 THEN 'New Items' 
     WHEN QtyIssued = 0 THEN 'Non-Moving' 
    ELSE 'Dead' 
    END 
WHEN MonthsRetrieved > 18 THEN 
    CASE 
     WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
     WHEN OpeningQty = 0 THEN 'New Items' 
     WHEN QtyIssued = 0 THEN 'Non-Moving' 
    ELSE 'Dead' 
    END 
END 

我从一个公式得到一个值个月,它是在MonthsRetrieved。 月份的另一个值是MonthsSinceLastReceipt,这是自上次收货日期以来的月份。 OpeningQty是特定日期的开始数量。 QtyIssued是两个日期之间发出的数量。

该项目正在分为快,慢,非常慢,死,新项目,非移动。 case语句是针对每个分类嵌套的。我得到的结果,但他们不正确。我相信我在声明中忽略了一些东西。

+1

你会得到什么结果以及它们为什么不正确?你能添加样本数据和预期结果吗? – HoneyBadger

+1

制作一张限量表。加入。一旦遇到。 – jarlh

+0

我看到的一件事是:'when openqty = 0 then'New Items'' - 当开始数量为0时,不应该是所有情况下的分类吗?你写它的方式,它不会是所有情况下,但只有当其他“WHEN”条件失败时。 “不移动”也一样。 – mathguy

回答

1

CASE中的WHEN按顺序进行评估。
一旦一个评估为真,随后会被忽略。

所以,当你比如做:

CASE WHEN x >= 1 and x < 3 THEN 
    CASE 
    WHEN x = 1 then 'one' 
    WHEN x < 3 then 'two' 
    WHEN y = 0 then 'THIS GETS NEVER EVALUATED' 
    END 
END 

这是第3从来没有得到评估,因为以前的检查之一,必将是真实的。

因此,您可能需要将这些检查移动到MonthsSinceLastReceipt检查上方的OpeningQty和QtyIssued上。

并审查如何检查MonthsSinceLastReceipt。其中一些检查将在您当前的查询中始终被忽略。

我建议用这些列名创建一个小样机表,并用每个案例的值填充。然后使用该表构造一个带有个案的查询,直到结果完全如您所期望的那样。

这是一个尝试。但是,如果不知道预期的结果应该如何,那只是一种猜测。

delete from TestTable; 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(0,0,0,0); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,0,0,0); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,0,0); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,6,19); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,6,13); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,6,7); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,6,3); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,12,19); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,12,13); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,12,7); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,18,19); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,18,15); 
insert into TestTable (OpeningQty,QtyIssued,MonthsRetrieved,MonthsSinceLastReceipt) values(1,1,19,0); 

select t.*, 
CASE 
WHEN OpeningQty = 0 THEN 'New Items' 
WHEN QtyIssued = 0 THEN 'Non-Moving' 
WHEN MonthsRetrieved = 0 THEN 'Dead' 
WHEN MonthsRetrieved BETWEEN 1 AND 6 THEN 
    (CASE 
    WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
    WHEN MonthsSinceLastReceipt > 12 THEN 'Very Slow' 
    WHEN MonthsSinceLastReceipt > 6 THEN 'Slow' 
    ELSE 'Fast' 
    END) 
WHEN MonthsRetrieved BETWEEN 7 AND 12 THEN 
    (CASE 
    WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
    WHEN MonthsSinceLastReceipt > 12 THEN 'Very Slow' 
    ELSE 'Slow' 
    END) 
WHEN MonthsRetrieved BETWEEN 13 AND 18 THEN 
    (CASE 
    WHEN MonthsSinceLastReceipt > 18 THEN 'Dead' 
    ELSE 'Very Slow' 
    END) 
WHEN MonthsRetrieved >= 19 THEN 'Dead' 
END as result 
from TestTable t;