值= 0而其他订单项> 0

时间:2018-05-22 01:07:22

标签: sql sql-server

我想知道如何编写一个查询,其中包含多个订单项的唯一ID将包含1个包含特定代码的订单项,我们将其称为A4445,其中费用金额为= 0,同时与该ID相关联的除A4445以外的其他代码的所有其他行将大于0,如下所示。如果数据如下所示:

   ID    | line item |  code  | Charge |
---------+-----------+--------+---------
 3334400 |     1     | A4445  | 32.50  |
 3334400 |     2     | B0021  |  0.00  | 
 3334400 |     3     | B0666  |  9.00  | 

但我希望ID为A4445代码= 0.00且其他行的费用金额大于> 0

   ID    | line item |  code  | Charge |
---------+-----------+--------+---------
 3334422 |     1     | A4445  |  0.00  |
 3334422 |     2     | B0021  | 12.30  | 
 3334422 |     3     | B0666  |  9.00  | 

我目前正在使用union all功能,但我认为它不起作用。这是我的问题:

Select 
       ID,
       Line item,
       Code,
       Charge    
from   
       claim    
where 
       code = 'A4445'
and    charge = 0.00

union all

Select 
       ID,
       Line item,
       Code,
       Charge    
from  
       claim    
where 
       code <> 'A4445'
and    charge > 0.00

我不确定如何表达这一点,但希望上面的插图能让您了解我正在寻找的内容

1 个答案:

答案 0 :(得分:0)

我相信你想要:

select c.id
from claim c
group by c.id
having max(case when c.code = 'A4445' then c.charge end) = 0 and
       min(case when c.code <> 'A4445' then c.charge end) > 0;

这假设charge永远不会消极(您的数据中没有这样的示例)。支持负电荷很容易,但逻辑稍微复杂一些。

如果您想要原始行,可以将其与joinexistsin一起使用以获取这些值。但是,我可能会使用not exists

select c.*
from claims c
where not exists (select 1
                  from claims c2
                  where c2.id = c.id and c2.code = 'A4445' and c2.charge <> 0
                 ) and
      not exists (select 1
                  from claims c2
                  where c2.id = c.id and c2.code <> 'A4445' and c2.charge = 0
                 );