价值 = 0 而其他订单项 > 0
Posted
技术标签:
【中文标题】价值 = 0 而其他订单项 > 0【英文标题】:value = 0 while other line items > 0 【发布时间】:2018-05-22 01:07:22 【问题描述】:我想知道如何编写一个查询,其中具有多个行项目的唯一 ID 将有一个具有特定代码的行项目,我们称之为 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 |
但我想要 A4445 代码 = 0.00 且其他行的收费金额大于 0 的 ID
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
我不确定如何表达这一点,但希望上面的插图能让您了解我在寻找什么
【问题讨论】:
A4445
是硬编码的吗?也不太了解您关于A4445 code = 0.00
的第二个条件。请详细说明
@Squirrel 是的,A4445 代码是强制性的。我希望 ID 的 A4445 代码等于 0.00,但我希望附加到 ID 的其他行不等于 0
【参考方案1】:
我相信你想要:
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
);
【讨论】:
“选择1”的目的是什么? @user9637230 。 . .not exists
只关心返回的行。我发现“1”是最简单的输入。以上是关于价值 = 0 而其他订单项 > 0的主要内容,如果未能解决你的问题,请参考以下文章