我想知道如何编写一个查询,其中包含多个订单项的唯一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
我不确定如何表达这一点,但希望上面的插图能让您了解我正在寻找的内容
答案 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
永远不会消极(您的数据中没有这样的示例)。支持负电荷很容易,但逻辑稍微复杂一些。
如果您想要原始行,可以将其与join
,exists
或in
一起使用以获取这些值。但是,我可能会使用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
);